在 WooCommerce 电子邮件通知中自定义电子邮件标头 [英] Customizing email headers in WooCommerce email notifications

查看:33
本文介绍了在 WooCommerce 电子邮件通知中自定义电子邮件标头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个过滤器来更改 WooCommerce 电子邮件的回复地址,具体取决于订单所在的账单城市".

I am trying to write a filter that changes the reply-to address for WooCommerce email, dependent on the 'billing city' the order is made for.

这适用于 WooCommerce 电子邮件,但似乎不适用于 WooCommerce 高级通知 - 它似乎没有将$order"传递到标题信息中以执行 IF 语句.

This works for WooCommerce emails, but doesn't seem to work for WooCommerce Advanced notifications - it doesn't seem to pass the '$order' into the header information to do the IF statement.

这是一个远景,但任何想法都非常感谢.这是我的代码.

It is a long shot but any thoughts much appreciated. This is my code.

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 高级通知插件中的代码.

This is the code in WooCommerce Advanced Notifications plugin.

/**
 * 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() );
}

进度编辑

所以现在基于 Loic 的善意建议,我已经应用了他的代码(如下),但是在启用 WooCommerce 高级通知的情况下会引发此致命错误.这是因为出于某种原因,'$order' 参数没有正确传递到 WooCommerce 高级通知电子邮件的过滤器,所以 $city = $order->get_billing_city();是空的.

So now based on Loic's kind advice I've applied his code (below) but it throws this Fatal error with WooCommerce Advanced Notifications enabled. This is because for some reason the '$order' argument is not correctly passed through to the filter on WooCommerce Advanced Notifications emails so $city = $order->get_billing_city(); is empty.

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 

推荐答案

您在函数中反转了关于 woocommerce_email_headers 过滤器钩子的参数(注意:我不要使用 WooCommerce 高级通知插件).

You have inverted the arguments in your function regarding woocommerce_email_headers filter hook (Note: I don't use WooCommerce Advanced Notifications plugin).

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

Instead try this (I have make some little changes):

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+ 上测试并有效.

This code is tested on WooCommerce versions 3+ and works.

这篇关于在 WooCommerce 电子邮件通知中自定义电子邮件标头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆