将供应商自定义字段邮箱添加至WooCommerce新订单邮件密送
问题分析与修复方案
你的代码核心问题是未正确获取订单对应的房源ID,$post_id变量未定义,导致get_field无法读取到供应商邮箱。另外需要确保从订单中关联到对应的房源(商品),再提取ACF字段值。
修复后的代码
将以下代码替换你当前的函数:
add_filter( 'woocommerce_email_headers', 'bcc_supplier_on_new_order', 20, 3 ); function bcc_supplier_on_new_order( $headers, $email_id, $order ) { // 仅针对新订单邮件 if ( $email_id !== 'new_order' ) { return $headers; } $supplier_email = ''; // 遍历订单中的商品,获取对应的房源ID(假设一个订单对应一个房源) foreach ( $order->get_items() as $item ) { $product_id = $item->get_product_id(); // 从房源(文章)中获取供应商邮箱 $supplier_email = get_field( 'supplier_email_main', $product_id ); if ( $supplier_email ) { break; // 找到第一个有效邮箱就停止 } } // 如果获取到供应商邮箱,添加到BCC/CC if ( $supplier_email ) { // 格式:BCC: 名称 <邮箱地址> $headers .= "BCC: Supplier <{$supplier_email}>\r\n"; // 你的测试邮箱也添加到BCC $headers .= "BCC: New Order <myemail@gmail.com>\r\n"; } return $headers; }
关键改动说明
- 获取订单商品ID:通过
$order->get_items()遍历订单商品,拿到每个商品对应的product_id(也就是你的房源文章ID)。 - 正确调用get_field:用商品ID作为第二个参数传入
get_field,确保读取到对应房源的ACF字段。 - 调整优先级:将钩子优先级从10改为20,确保在其他可能修改headers的代码之后执行,避免被覆盖。
- 格式规范:保持邮件头的换行格式
\r\n,确保邮件客户端能正确解析。
调试排查步骤
如果还是没收到邮件,可以加日志排查:
// 在获取supplier_email后添加 error_log( '供应商邮箱:' . $supplier_email ); error_log( '最终邮件头:' . $headers );
日志会保存在wp-content/debug.log(需要先开启WP_DEBUG),查看是否正确获取到邮箱,以及邮件头格式是否正确。
内容的提问来源于stack exchange,提问作者johnnyc0506
相关产品推荐
相关产品推荐

