如何将WooCommerce自定义参会者邮箱添加至订单邮件抄送列表?
问题排查方向
1. 参会者邮箱数据获取逻辑错误
- 可能是自定义字段键名拼写错误,或者遍历方式和商品数量不匹配。比如你的字段命名是
participant_email_1、participant_email_2这类,要确保循环次数和订单商品数量一致,键名拼接完全正确。 - 检查
get_post_meta($order_id, '字段名', true)的参数:第三个参数如果是true(默认),只会返回单个值,要是你存的是数组,得改成false;同时要确认字段名和结账时保存的完全一致,大小写、下划线都不能错。
2. 邮件钩子使用错误
- 用
woocommerce_email_headers钩子时,优先级设置可能太低,被其他代码覆盖。建议设为20(高于默认的10)。 - 要精准判断邮件类型:必须在回调里检查
$email->id是否为customer_processing_order和customer_completed_order,如果判断条件写错,就不会触发CC添加逻辑。
3. CC格式不符合要求
- 邮件CC需要逗号分隔的字符串,直接传数组会失效。收集到邮箱数组后,要先用
implode(', ', $emails_array)转成字符串。 - 必须过滤无效邮箱:用
is_email()函数验证每个邮箱,空值或格式错误的邮箱要排除,避免单个无效邮箱导致整个CC列表失效。
4. 订单元数据保存层级问题
- 如果参会者数据是按多维数组保存的,获取时要正确解析层级。比如存的是
participants数组,里面每个元素包含邮箱,那遍历的时候要先取出整个数组,再逐个提取邮箱字段。
5. 代码执行顺序或缓存问题
- 要是代码写在主题
functions.php里,可能被其他插件/主题的代码覆盖,建议放到自定义插件里执行。 - 测试时要清空WooCommerce缓存,用全新订单测试,避免旧数据干扰。
参考正确代码示例
add_filter('woocommerce_email_headers', 'add_participants_to_email_cc', 20, 3); function add_participants_to_email_cc($headers, $email_id, $order) { // 仅针对处理中和完成状态的客户邮件 if (!in_array($email_id, ['customer_processing_order', 'customer_completed_order'])) { return $headers; } $participant_emails = []; $item_count = $order->get_item_count(); // 遍历每个参会者邮箱字段 for ($i = 1; $i <= $item_count; $i++) { $email = get_post_meta($order->get_id(), 'participant_email_' . $i, true); if (is_email($email)) { $participant_emails[] = $email; } } if (!empty($participant_emails)) { $cc_str = implode(', ', $participant_emails); $headers .= "Cc: $cc_str\r\n"; } return $headers; }
内容的提问来源于stack exchange,提问作者Drahomír Mejzr
相关产品推荐
相关产品推荐

