如何在购买产品2周后自动发送电子邮件到WooCommerce订单META中的自定义字段

时间:2019-03-14 作者:Sadiq11111

我正在使用woocommerce建立一个网站,在那里人们可以发布演出(产品),对这些演出感兴趣的人可以付费联系发布演出的人。我有一个自定义字段,名为customer_email 在产品编辑页面中,我保存了发布gig的人的电子邮件,并且我能够在每次购买gig(产品)时将该字段的值传递给订单元。现在我想做的是能够向customer_email 购买gig(产品)两周后,我希望电子邮件内容包括购买gig(产品)的人的个人资料链接。

电子邮件示例:

收件人:[email protected] (customer_email 产品和订单元中的字段)

你好,迈克尔(customer_name 产品和订单元中的字段)

Socratis Engineering(购买产品的人的名字)联系了您,了解您在我们平台上发布的工作。你雇用他们了吗?如果有,请花点时间回顾一下他们的工作。

https://example.com/socratis-engineering/review (链接到购买产品的人的个人资料审查页面)

您好,123团队

我一直在探索使用wordpress cron job来实现这一点,但我面临的第一个问题是,我无法从woocommerce获得相关的订单元价值。我想为每个订单安排并发送电子邮件,但我就是想不出来。我对wordpress和php非常陌生。

如果有人知道一个插件可以满足我的要求,我也愿意接受插件解决方案。我将非常感谢你的帮助。

1 个回复
SO网友:Antti Koskinen

现在已经很晚了,因为我正在键入这段代码,所以请对下面的代码持保留态度。

我认为如果您修改这里提供的代码(下面的修改版本供将来参考),https://businessbloomer.com/woocommerce-custom-cron-job/ (我不是该网站的附属机构),你应该把事情做好。

你需要改变的是part D. 添加foreach循环以遍历所有匹配的订单。使用订单id获取所需订单和自定义元数据,创建并发送电子邮件。你可以使用一个助手函数来创建电子邮件正文,也可以在循环中完成这项工作——我认为这是一个品味问题。

您可能还想更改计划。在原始代码示例中,它被设置为三个小时。对你来说,也许每天一次更合适,是吗?

<?php
/**
 * @snippet       Schedule Email to WooCommerce Admin Every 3 Hours
 * @how-to        Watch tutorial @ https://businessbloomer.com/?p=19055
 * @sourcecode    https://businessbloomer.com/?p=106360
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 3.5.4
 */

// ---- ---- ----
// A. Define a cron job interval if it doesn\'t exist

add_filter( \'cron_schedules\', \'bbloomer_check_every_3_hours\' );

function bbloomer_check_every_3_hours( $schedules ) {
    $schedules[\'every_three_hours\'] = array(
        \'interval\' => 10800, // <= you might want to change this to something less frequent, once daily?
        \'display\'  => __( \'Every 3 hours\' ),
    );
    return $schedules;
}

// ---- ---- ----
// B. Schedule an event unless already scheduled

add_action( \'wp\', \'bbloomer_custom_cron_job\' );

function bbloomer_custom_cron_job() {
    if ( ! wp_next_scheduled( \'bbloomer_woocommerce_send_email_digest\' ) ) {
        wp_schedule_event( time(), \'every_three_hours\', \'bbloomer_woocommerce_send_email_digest\' );
    }
}

// ---- ---- ----
// C. Trigger email when hook runs

add_action( \'bbloomer_woocommerce_send_email_digest\', \'bbloomer_generate_email_digest\' );

// ---- ---- ----
// D. Generate email content and send email if there are completed orders

function bbloomer_generate_email_digest() { 
    $range = 180; // 3 hours in minutes
    $completed_orders = bbloomer_get_completed_orders_before_after( strtotime( \'-\' . absint( $end ) . \' MINUTES\', current_time( \'timestamp\' ) ), current_time( \'timestamp\' ) ); // Change parameters to compare desired time period 
    if ( $completed_orders ) {

      // Untested, but something like this should work
      foreach ( $completed_orders as $completed_order_id ) {
        $customer_email = get_post_meta( $completed_order_id, \'customer_email\', true );
        $order = wc_get_order( $completed_order_id );        
        if ( $customer_email ) {
          $email_subject = "Gig feedback";
          $email_content = get_email_content( $order );
          wp_mail( $customer_email, $email_subject, $email_content );
        }        
      }

    }
}
// Helper function to make the email loop a little cleaner
function get_email_content( $order ) {
  // Return email content
}

// ---- ---- ----
// E. Query WooCommerce database for completed orders between two timestamps

function bbloomer_get_completed_orders_before_after( $date_one, $date_two ) {
    global $wpdb;
    $completed_orders = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT posts.ID
            FROM {$wpdb->prefix}posts AS posts
            WHERE posts.post_type = \'shop_order\'
            AND posts.post_status = \'wc-completed\'
            AND posts.post_modified >= \'%s\'
            AND posts.post_modified <= \'%s\'",
            date( \'Y/m/d H:i:s\', absint( $date_one ) ),
            date( \'Y/m/d H:i:s\', absint( $date_two ) )
        )
    );
    return $completed_orders;
}
另外,我明天会尽量记住再看一遍。

相关推荐