WooCommerce订单元数据存额外邮件收件人,如何挂钩订单确认邮件?
解决方案
核心原因:WooCommerce 不存在 woocommerce_email_recipient_customer_new_order 钩子,是因为new_order类邮件默认仅发送给站点管理员,发送给客户的订单确认邮件对应两类状态的邮件ID,只需补充对应钩子挂载即可正常实现需求。
方案1:补充缺失的钩子挂载
你已经编写好了通用的收件人追加逻辑,只需在现有钩子列表基础上,补充客户待确认订单对应的钩子即可:
// 追加到你现有add_filter代码段的最前面即可 add_filter('woocommerce_email_recipient_customer_on_hold_order', 'ddl_additional_email_checkout', 10, 2);
如果你的站点开启了下单直接进入处理中状态,你已经挂载的 woocommerce_email_recipient_customer_processing_order 已经覆盖了对应场景,加上待支付状态的钩子就能覆盖所有客户首次收到的订单确认邮件场景。
方案2:高版本兼容优化
如果你的站点运行的是 WooCommerce 3.0 及以上版本,建议将函数内获取订单ID的写法调整,避免直接访问对象属性带来的兼容问题:
function ddl_additional_email_checkout($emails, $object){ // 替换原来的$object->id为get_id()方法 $additional_email = get_post_meta($object->get_id(), 'additional_recipient', true); if( $additional_email ){ $emails .= ',' . $additional_email; } return $emails; }
可选方案:统一所有客户邮件的额外收件人逻辑
如果希望所有发送给客户的订单相关邮件都自动追加额外收件人,不需要逐个挂载钩子,可以直接用通用的邮件过滤器实现:
add_filter('woocommerce_email_recipient', 'ddl_additional_email_checkout_all_customer', 10, 3); function ddl_additional_email_checkout_all_customer($emails, $email_id, $object){ // 仅处理客户相关的订单邮件,排除管理员邮件 if (str_starts_with($email_id, 'customer_') && is_a($object, 'WC_Order')) { $additional_email = get_post_meta($object->get_id(), 'additional_recipient', true); if( $additional_email ){ $emails .= ',' . $additional_email; } } return $emails; }
注:如果你的服务器PHP版本低于8.0,可将判断条件替换为
if (0 === strpos($email_id, 'customer_') && is_a($object, 'WC_Order'))
用这个方案可以删掉你之前所有单独挂载的woocommerce_email_recipient_*钩子,代码更简洁。
内容的提问来源于stack exchange,提问作者Qubical
相关产品推荐
相关产品推荐

