Woocommerce - 需要根据邮政编码向特定地址发送电子邮件

时间:2014-10-17 16:30:15

标签: php wordpress email woocommerce

基本上,在woocommerce中,您可以选择输入多个电子邮件地址(以逗号分隔),以便将完成的订单发送给WooCommerce中的>设置 - >电子邮件 - >新命令。但我需要一种方法,根据订购产品的客户的邮政编码,只发送给其中一个收件人。或完全覆盖woocommerce的处理方式。

如何绑定到负责此功能的功能,以便发送给正确的收件人?基本上,是否有为此定义的钩子,或者是否存在这样的插件,或者我是否必须编辑核心WooCommerce文件?如果核心文件需要编辑,有人可以指出哪些文件需要编辑正确的方向?

2 个答案:

答案 0 :(得分:1)

每封电子邮件都有一个过滤器,可让您调整该电子邮件的收件人。过滤器名称基本上为woocommerce_email_recipient_{$email_id}

所以以下内容会过滤"到" " new_order"的地址电子邮件。

add_filter( 'new_order' , 'so_26429482_add_recipient', 20, 2 );
function so_26429482_add_recipient( $email, $order ) {
    $additional_email = "somebody@somewhere.net";
    if( $order->shipping_postcode == "90210" ){
        $email = explode( ',', $email );
        array_push( $email, $additional_email );
    }
    return $email;
}

我对条件逻辑并非100%肯定,但我认为应检查发货邮政编码,然后发送到其他电子邮件地址。

答案 1 :(得分:0)

我对helgatheviking的回答有点麻烦,而且用例也略有不同。 我的问题/需求是:

  • 我对上述过滤器名称不太了解。
  • class-wc-email.php内部的public function get_recipient()希望有一个字符串,但正在获取一个数组。
  • A还希望根据付款方式而不是邮政编码有条件地添加额外的收件人。

这是我所做的:

  • 添加了完整的过滤器名称,而不仅仅是后缀:add_filter( 'woocommerce_email_recipient_new_order' , 'so_26429482_add_recipient', 20, 2 );
  • explode()array_push()替换为字符串串联$email .= ',' . $additional_email;
  • 有条件地使用if( $order->get_payment_method() == "cod" ) { //code }检查了付款方式。

完整示例:

/* Add ISF Email copies */
add_filter( 'woocommerce_email_recipient_new_order' , 'so_26429482_add_recipient', 20, 2 );
function so_26429482_add_recipient( $email, $order ) {

//!empty($order) prevents a fatal error in WooCommerce Settings
//!empty($email) prevents the duplicate email from being sent in cases where the filter is run outside of when emails are normally sent. In my case, when using https://wordpress.org/plugins/woo-preview-emails/.
if(!empty($order) && !empty($email)) {

    $additional_email = "isf@ptdev.co";

    if( $order->get_payment_method() == "cod" ){        
        $email .= ',' . $additional_email;
    } else {            
        $email .= ',h7@ptdev.co';
    }

} //if not empty

//error_log('Payment Method: ' . $order->get_payment_method(), 0);

return $email;

}