问题描述

在我问这个问题之前,我知道有一个 (合法的) 犹豫,回答有关 Woo 产品的问题,因为他们有自己的支持,并且鼓励用户使用它。我是一个付费的 Woo 用户,但是无法通过付出的支持来解决这个问题,而且我的问题是关于 WP 中的最重要的课程,所以我希望它会得到一个公平的听证会。

我的问题:当一个完整的订单电子邮件发送给客户时,我还需要逐字地收到这封电子邮件,并将其自动发送到客户,而不是像其他各种发票 PDF 创建的其他格式 WooCommerce 插件。我可以很容易地通过更改/woocommerce/classes/emails/class-wc-email-customer-completed-order.php 中的以下行来完成此操作:

$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );

读书:

$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
$this->send( me@myemail.com, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );

但是,显然,这样的黑客并不会在升级中生存下去。我有一个覆盖 WooCommerce 模板的子主题。有没有任何等同的机制,我可以通过类似的封装方式覆盖一个类?或者您可以推荐一种替代方法 (除了将 SMTP 服务器设置为将所有发出的电子邮件传递到第二个地址),以完成在客户接收时收到此电子邮件的具体任务?

最佳解决方案

实际上可以使用一个过滤器,请参阅 abstract-wc-email.php 第 214 行:

return apply_filters( 'woocommerce_email_recipient_' . $this->id, $this->recipient, $this->object );

你可以将以下内容放在你的 functions.php 中:

add_filter( 'woocommerce_email_recipient_customer_completed_order', 'your_email_recipient_filter_function', 10, 2);

function your_email_recipient_filter_function($recipient, $object) {
    $recipient = $recipient . ', me@myemail.com';
    return $recipient;
}

唯一的缺点是收件人会看到你的地址和他自己在 To:领域。


或者,建立在 Steve 的答案上,您可以使用 woocommerce_email_headers 过滤器。传递的 $对象允许您仅将其应用于已完成的订单电子邮件:

add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);

function mycustom_headers_filter_function( $headers, $object ) {
    if ($object == 'customer_completed_order') {
        $headers .= 'BCC: My name <my@email.com>' . "rn";
    }

    return $headers;
}

次佳解决方案

还有另一个过滤器可以让您访问 $ header 变量,这样可以允许您将电子邮件发送给 BCC,以便您获得在 Woocommerce 上向客户发送的每封电子邮件的副本。这与上述代码一样简单,除非您的客户端看不到您的电子邮件地址。

就像上面的解决方案,你将添加以下代码:

add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);

function mycustom_headers_filter_function($headers, $object) {
    $headers = array();
    $headers[] = 'Bcc: your name <me@myemail.com>';
    $headers[] = 'Content-Type: text/html';
    return $headers;
}

此过滤器适用于所有 $标题,也适用于硬编码类型为 text /html 。请注意,您不要在内容类型声明中包含’/r/n’ – 这可能会导致 wp_mail() 中的错误 – 这是 Woocommerce 用于发送消息的方式。

我使用这个代码,所以我可以验证 Woocommerce v2.0.14 。也应该在早期版本中工作,但不确定过滤器已包含多长时间。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。