首页 文章

在WooCommerce电子邮件通知中自定义电子邮件标头

提问于
浏览
1

我正在尝试编写一个过滤器,用于更改WooCommerce电子邮件的回复地址,具体取决于订单的“结算城市” .

这适用于WooCommerce电子邮件,但似乎不适用于WooCommerce Advanced通知 - 它似乎没有将'$ order'传递到头信息中来执行IF语句 .

这是一个很长的镜头,但任何想法都非常感激 . 这是我的代码 .

function change_headers($order, $object, $headers);

// Get the city 
$city = $order->get_billing_city();

// Change Headers

if ($city == 'Manchester') {
    $headers = array();
    $headers[] = 'Reply-to: Manchester <manchester@city.org>';
return $headers;
} else {
    $headers = array();
    $headers[] = 'Reply-to: London <london@city.org>';
return $headers;
}

add_filter( 'woocommerce_email_headers', 'change_headers', 10, 3);

这是WooCommerce Advanced Notifications插件中的代码 .

/**
 * sends an email through WooCommerce with the correct headers
 */
public function send( $id, $object, $is_plain_text, $to, $subject, $message, $notification ) {
    $email = new WC_Email();

    if ( $is_plain_text ) {
        $message = wordwrap( strip_tags( $message ), 60 );
        $email->email_type = 'plain';
    } else {
        $email->email_type = 'html';
    }

    $email->id = "advanced_notification_{$notification->notification_id}";

    $email->send( $to, $subject, $message, $email->get_headers(), $email->get_attachments() );
}

PROGRESS EDIT

所以现在基于Loic的善意建议我已经应用了他的代码(下面),但它在启用了WooCommerce Advanced Notifications时抛出了这个致命错误 . 这是因为由于某种原因,'$ order'参数未正确传递到WooCommerce Advanced Notifications电子邮件上的过滤器,所以$ city = $ order-> get_billing_city();是空的 .

Fatal error: Uncaught Error: Call to a member function get_billing_city() on null in /home/benefacto/public_html/dev/wp-content/plugins/bnfo-custom-emails/bnfo-custom-emails.php:130 Stack trace: #0 /home/benefacto/public_html/dev/wp-includes/class-wp-hook.php(298): custom_email_notification_headers('Content-Type: t...', 'advanced_notifi...', NULL) #1 /home/benefacto/public_html/dev/wp-includes/plugin.php(203): WP_Hook->apply_filters('Content-Type: t...', Array) #2 /home/benefacto/public_html/dev/wp-content/plugins/woocommerce/includes/emails/class-wc-email.php(287): apply_filters('woocommerce_ema...', 'Content-Type: t...', 'advanced_notifi...', NULL) #3 /home/benefacto/public_html/dev/wp-content/plugins/woocommerce-advanced-notifications/includes/class-wc-advanced-notifications.php(257): WC_Email->get_headers(NULL) #4 /home/benefacto/public_html/dev/wp-content/plugins/woocommerce-advanced-notifications/includes/class-wc-advanced-notifications.php(319): WC_Advanced_Notifications->send('new_order', Object(WC_Order), '0', 'l in /home/benefacto/public_html/dev/wp-content/plugins/bnfo-custom-emails/bnfo-custom-emails.php on line 130

1 回答

  • 1

    你已经在函数中反转了关于 woocommerce_email_headers 过滤器钩子的参数(注意:我不使用WooCommerce Advanced Notifications插件) .

    而是尝试这个(我做了一些小改动):

    add_filter( 'woocommerce_email_headers', 'custom_email_notification_headers', 10, 3 );
    function custom_email_notification_headers( $headers, $email_id, $order ) {
    
        // Get the city
        $city = $order->get_billing_city();
    
        $headers = array( $headers );
    
        if ($city == 'Manchester')
        {
            $headers[] = 'Reply-to: Manchester <manchester@city.org>';
        }
        else
        {
            $headers[] = 'Reply-to: London <london@city.org>';
        }
        return $headers;
    }
    

    代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中 .

    此代码在WooCommerce版本3上进行测试并且有效 .

相关问题