更改 WooCommerce 电子邮件收件人


Changing WooCommerce e-mail recipient

如何覆盖WooCommerce电子邮件类中的现有功能以更改主题中电子邮件的收件人?

负责发送电子邮件的类需要切换收件人是WC_Email_Cancelled_Order。我希望它不是发送到指定数量的管理员电子邮件,而是将订单已取消的电子邮件发送给客户。

WC_Email_Cancelled_Order我认为在第 42 行的构造函数中它设置了接收者。

我是否应该使用第 35 行和第 36 行上定义的操作来执行此操作?如果是这样,我将如何去做?

编辑:

最终做了以下事情,以实现我想要做的事情

add_action( 'woocommerce_order_status_pending_to_cancelled_notification', 'hg_override_cancelled_email_recipient' );
add_action( 'woocommerce_order_status_on-hold_to_cancelled_notification', 'hg_override_cancelled_email_recipient' );
function hg_override_cancelled_email_recipient( $order_id ) {
    $cancelledEmail = new WC_Email_Cancelled_Order();
    if ( $order_id ) {
        $cancelledEmail->object                  = wc_get_order( $order_id );
        $cancelledEmail->find['order-date']      = '{order_date}';
        $cancelledEmail->find['order-number']    = '{order_number}';
        $cancelledEmail->replace['order-date']   = date_i18n( wc_date_format(), strtotime( $cancelledEmail->object->order_date ) );
        $cancelledEmail->replace['order-number'] = $cancelledEmail->object->get_order_number();
        $cancelledEmail->recipient               = $cancelledEmail->object->billing_email;
    }
    if ( ! $cancelledEmail->is_enabled() || ! $cancelledEmail->get_recipient() ) {
        return;
    }
    $cancelledEmail->send(
        $cancelledEmail->get_recipient(),
        $cancelledEmail->get_subject(),
        $cancelledEmail->get_content(),
        $cancelledEmail->get_headers(),
        $cancelledEmail->get_attachments()
    );
}

您可以通过woocommerce_email_recipient_$email_id过滤器过滤收件人,并提供以逗号分隔的电子邮件列表。

function so_35900307_email_recipient( $recipient, $order ){
   return $order->billing_email;
}
add_filter( 'woocommerce_email_recipient_cancelled_order', 'so_35900307_email_recipient', 10, 2 );

编辑

随着WooCommerce 2.7的出现,$order->billing_email(实际上,所有订单属性)已被弃用,取而代之的是get_something()样式方法。因此,为了修改我的答案以前后兼容性,我添加了一个method_exists()测试:

function so_35900307_email_recipient( $recipient, $order ){
   if( method_exists ( $order , 'get_billing_email' ) ){
        $recipient = $order->get_billing_email();
    } else {
        $recipient = $order->billing_email;
    }
    return $recipient;
}
add_filter( 'woocommerce_email_recipient_cancelled_order', 'so_35900307_email_recipient', 10, 2 );