向客户发送有关WooCommerce已取消订单状态的自定义通知

时间:2019-05-06 作者:Oliver

在WooCommerce中,当订单状态为“已取消”时,我试图向客户发送电子邮件通知。

这是我的代码放在我的子主题函数中。php文件:

add_filter(\'woocommerce_order_status_changed\', \'send_mail_abandonned_order\', 10, 4);
function woocommerce_send_mail_abandonned_order($order, $new_status)
{
    if (!$order ||  $new_status != \'cancelled\') return;
    print("Entering in function"); //nothing append
    throw new("error"); // Nothing append  
    //$order = new WC_Order($order_id);
    $order = wc_get_order($order);
    if ( $new_status == \'cancelled\' ) {
        //$customer_email = $order->get_billing_email(); // The customer email
        ob_start();
        include( \'email/mail.php\' );
        $message =  ob_get_clean();
        define("HTML_EMAIL_HEADERS", array(\'Content-Type: text/html; charset=UTF-8\'));
        // Get woocommerce mailer from instance
        $mailer = WC()->mailer();
        // Wrap message using woocommerce html email template
        $wrapped_message = $mailer->wrap_message("Vous n\'avez pas oublié quelque chose ?", $message);
        // Create new WC_Email instance
        $wc_email = new WC_Email;
        // Style the wrapped message with woocommerce inline styles
        $html_message = $wc_email->style_inline($wrapped_message);
        // Send the email using wordpress mail function
        wp_mail( "[email protected]", \'Oups Vous n\\\'avez pas oubliez quelque chose ?\', $html_message, HTML_EMAIL_HEADERS );
    } 
}
但我不知道为什么这个钩子不能正常工作。当我将订单状态更改为“已取消”并尝试抛出错误时,php错误日志中不会追加任何内容。看来这个钩子坏了。

如何解决这个问题?

2 个回复
最合适的回答,由SO网友:Oliver 整理而成

以下是解决方案。。。


// CHANGE THE HOOK DESCRIPTION
add_filter(\'woocommerce_order_status_cancelled\', \'woocommerce_send_mail_abandonned_order\',21, 1);
function woocommerce_send_mail_abandonned_order($order_id)
{
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if ($order->has_status(\'cancelled\')) {
        //$customer_email = $order->get_billing_email(); // The customer email
        ob_start();
        include( \'email/mail.php\' );
        $message =  ob_get_clean();
        define("HTML_EMAIL_HEADERS", array(\'Content-Type: text/html; charset=UTF-8\'));
        // Get woocommerce mailer from instance
        $mailer = WC()->mailer();
        // Wrap message using woocommerce html email template
        $wrapped_message = $mailer->wrap_message("Vous n\'avez pas oublié quelque chose ?", $message);
        // Create new WC_Email instance
        $wc_email = new WC_Email;
        // Style the wrapped message with woocommerce inline styles
        $html_message = $wc_email->style_inline($wrapped_message);
        // Send the email using wordpress mail function
        wp_mail( "[email protected]", \'Oups Vous n\\\'avez pas oubliez quelque chose ?\', $html_message, HTML_EMAIL_HEADERS );
    } 
}

也按$order\\u id更改$order

SO网友:LoicTheAztec

更好的解决方案是使用woocommerce_order_status_cancelled 钩子函数,所以缺少$order 变量

也作为行动挂钩woocommerce_order_status_cancelled 当订单状态更改为“已取消”时触发,因此在您的代码中,if ($order->has_status(\'cancelled\')) { 不需要。

那么您的代码将是:

add_filter(\'woocommerce_order_status_cancelled\', \'woocommerce_send_mail_abandonned_order\', 10, 2 );
function woocommerce_send_mail_abandonned_order( $order_id, $order )
{
    define("HTML_EMAIL_HEADERS", array(\'Content-Type: text/html; charset=UTF-8\'));

    // Get WooCommerce mailer from instance
    $mailer = WC()->mailer();

    ob_start();
    include( \'email/mail.php\' );
    $message = ob_get_clean();

    // Wrap message using woocommerce html email template
    $wrapped_message = $mailer->wrap_message("Vous n\'avez pas oublié quelque chose ?", $message);

    // Create new WC_Email instance
    $wc_email = new WC_Email;

    // Style the wrapped message with woocommerce inline styles
    $html_message = $wc_email->style_inline($wrapped_message);

    // Send the email using wordpress mail function
    wp_mail( $order->get_billing_email(), \'Oups Vous n\\\'avez pas oubliez quelque chose ?\', $html_message, HTML_EMAIL_HEADERS );
}
或者woocommerce_order_status_changed 钩子(你的问题钩子):

add_filter(\'woocommerce_order_status_changed\', \'woocommerce_send_mail_abandonned_order\', 10, 4 );
function woocommerce_send_mail_abandonned_order(  $order_id, $old_status, $new_status, $order )
{
    if ( $new_status === \'cancelled\') 
    {
        define("HTML_EMAIL_HEADERS", array(\'Content-Type: text/html; charset=UTF-8\'));

        // Get WooCommerce mailer from instance
        $mailer = WC()->mailer();

        ob_start();
        include( \'email/mail.php\' );
        $message = ob_get_clean();

        // Wrap message using woocommerce html email template
        $wrapped_message = $mailer->wrap_message("Vous n\'avez pas oublié quelque chose ?", $message);

        // Create new WC_Email instance
        $wc_email = new WC_Email;

        // Style the wrapped message with woocommerce inline styles
        $html_message = $wc_email->style_inline($wrapped_message);

        // Send the email using wordpress mail function
        wp_mail( $order->get_billing_email(), \'Oups Vous n\\\'avez pas oubliez quelque chose ?\', $html_message, HTML_EMAIL_HEADERS );
    }
}
代码进入函数。活动子主题(或活动主题)的php文件。已测试并正常工作。

相关推荐

如何从全站模板文件中的函数.php中调用定制函数?

我在wp-content/themes/xxxx/modules/custom中有一个自定义php文件。php和我想从函数中调用函数。php。现在我所有的函数(相同的函数)都在不同的文件中,因为仍然无法解决这个问题。我想在函数中创建一个函数。php并从网站的任何地方调用此函数。此函数将从另一个php文件调用(Ajax不会调用此函数)。当我包括或需要任何文件时(不导入wp load、wp blog header、functions.php)我读了很多论坛,尝试了很多方法,比如1.define(\'WP_US