【问题标题】:Send a custom reminder email for WooCommerce On-Hold orders after two days两天后为 WooCommerce On-Hold 订单发送自定义提醒电子邮件
【发布时间】:2019-09-12 13:18:21
【问题描述】:

如果订单状态为暂停且订单创建时间超过 48 小时,我的目标是向客户发送包含自定义文本的电子邮件。

  1. 订单已有 48 小时或更长时间
  2. 向客户发送电子邮件
  3. 要求客户付款
  4. 包含指向订单的链接(指向我的帐户付款页面)

我正在尝试使用 an answer 中的代码来解决我之前关于在 WooCommerce 中未付款的情况下 X 天后自动取消订单的问题之一。

我稍微修改了代码:

add_action( 'restrict_manage_posts', 'on_hold_payment_reminder' );
function on_hold_payment_reminder() {
    global $pagenow, $post_type;

    if( 'shop_order' === $post_type && 'edit.php' === $pagenow 
        && get_option( 'unpaid_orders_daily_process' ) < time() ) :

    $days_delay = 5;

    $one_day    = 24 * 60 * 60;
    $today      = strtotime( date('Y-m-d') );

    $unpaid_orders = (array) wc_get_orders( array(
        'limit'        => -1,
        'status'       => 'on-hold',
        'date_created' => '<' . ( $today - ($days_delay * $one_day) ),
    ) );

    if ( sizeof($unpaid_orders) > 0 ) {
        $reminder_text = __("Payment reminder email sent to customer $today.", "woocommerce");

        foreach ( $unpaid_orders as $order ) {
            // HERE I want the email to be sent instead  <===  <===  <===  <===  <=== 
        }
    }
    update_option( 'unpaid_orders_daily_process', $today + $one_day );

    endif;
}

这是我要与上面同步的电子邮件部分(阅读代码 cmets):

add_action ('woocommerce_email_order_details', 'on_hold_payment_reminder', 5, 4);
function on_hold_payment_reminder( $order, $sent_to_admin, $plain_text, $email ){

    if ( 'customer_on_hold_order' == $email->id ){
        $order_id = $order->get_id();

        echo "<h2>Do not forget about your order..</h2>
        <p>CUSTOM MESSAGE HERE</p>";
    }
}

那么,如何使用自定义文本发送“暂停”订单的电子邮件通知提醒?

【问题讨论】:

    标签: php wordpress woocommerce orders email-notifications


    【解决方案1】:

    以下代码将每天触发一次,并将发送一封电子邮件提醒,其中包含未付款订单的自定义消息(对于“暂停”订单状态)

    add_action( 'restrict_manage_posts', 'on_hold_payment_reminder' );
    function on_hold_payment_reminder() {
        global $pagenow, $post_type;
    
        if( 'shop_order' === $post_type && 'edit.php' === $pagenow
            && get_option( 'unpaid_orders_reminder_daily_process' ) < time() ) :
    
        $days_delay = 2; // 48 hours
        $one_day    = 24 * 60 * 60;
        $today      = strtotime( date('Y-m-d') );
    
        $unpaid_orders = (array) wc_get_orders( array(
            'limit'        => -1,
            'status'       => 'on-hold',
            'date_created' => '<' . ( $today - ($days_delay * $one_day) ),
        ) );
    
        if ( sizeof($unpaid_orders) > 0 ) {
            $reminder_text = __("Payment reminder email sent to customer $today.", "woocommerce");
    
            foreach ( $unpaid_orders as $order ) {
                $order->update_meta_data( '_send_on_hold', true );
                $order->update_status( 'reminder', $reminder_text );
    
                $wc_emails = WC()->mailer()->get_emails(); // Get all WC_emails objects instances
                $wc_emails['WC_Email_Customer_On_Hold_Order']->trigger( $order->get_id() ); // Send email
            }
        }
        update_option( 'unpaid_orders_reminder_daily_process', $today + $one_day );
    
        endif;
    }
    
    
    add_action ( 'woocommerce_email_order_details', 'on_hold_payment_reminder_notification', 5, 4 );
    function on_hold_payment_reminder_notification( $order, $sent_to_admin, $plain_text, $email ){
        if ( 'customer_on_hold_order' == $email->id && $order->get_meta('_send_on_hold') ){
            $order_id     = $order->get_id();
            $order_link   = wc_get_page_permalink('myaccount').'view-order/'.$order_id.'/';
            $order_number = $order->get_order_number();
    
            echo '<h2>'.__("Do not forget about your order.").'</h2>
            <p>'.sprintf( __("CUSTOM MESSAGE HERE… %s"), 
                '<a href="'.$order_link.'">'.__("Your My account order #").$order_number.'<a>'
            ) .'</p>';
    
            $order->delete_meta_data('_send_on_hold');
            $order->save();
        }
    }
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    【讨论】:

    • 如果我想测试一下,请告诉我如何格式化时间。我尝试使用 1 和 1 * 1 但没有任何反应。如何将时间变成 30 秒,以便我可以下测试订单,进入管理并刷新订单页面并收到电子邮件?
    • view-order/1516/ 是干什么用的?那是如何链接到电子邮件所指的实际订单吗?
    • 每天什么时候更新?意义;我怎么知道函数每天何时运行?另外,有没有办法消除那种“触发器”?如果它只检查订单创建的时间会更好,如果该时间超过时间延迟,则发送电子邮件。
    • 我在问,因为到目前为止我还没有发生任何事情。我已将计算更改为 60 * 60 * 24(每分钟 60 秒、每小时 60 分钟和每天 24 小时)。这也无济于事。
    • @KevinAronsson 最好根据订单状态变化事件使用其他方法……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2018-01-15
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    相关资源
    最近更新 更多