修复woocommerce_email_headers过滤器按订单变量抄送用户及账单邮箱失效问题
问题排查与修复方案
现有代码错误点
- 未定义
$user变量:代码仅获取了用户ID,没有初始化用户对象就直接调用get_first_name()、get_last_name()方法,会直接触发致命错误 - 重复获取订单对象:
woocommerce_email_headers过滤器传入的第三个参数$order本身就是已实例化的WC_Order对象,不需要再调用wc_get_order()二次获取 - 转义字符解析错误:
\r\n换行符放在单引号内不会被PHP解析为换行,只会被当作普通字符串输出,导致邮件头格式错误 - 缺少边界判断:未处理游客下单(无关联用户ID)、
get_userdata()返回false的异常场景,会引发报错
修复后可用代码
add_filter( 'woocommerce_email_headers', 'cc_user_function', 10, 3); function cc_user_function($headers, $email_id, $order) { // 只针对自定义邮件模板 + 验证订单对象有效性 if ($email_id == 'my_custom_email' && is_a($order, 'WC_Order')) { $user_id = $order->get_user_id(); // 排除游客下单场景,如有需要可调整为获取订单账单邮箱 if ($user_id) { $user = get_userdata($user_id); if ($user) { $cc_email = $user->user_email; $user_name = $user->first_name . ' ' . $user->last_name; $formatted_email = utf8_decode($user_name . ' <' . $cc_email . '>'); // 换行符用双引号包裹才能正确解析 $headers .= "Cc: ".$formatted_email ."\r\n"; } } } return $headers; }
补充说明
如果你的自定义邮件模板需要同时支持游客下单场景抄送,可将用户ID判断替换为调用$order->get_billing_email()获取订单提交的账单邮箱即可。
内容的提问来源于stack exchange,提问作者user16877254
相关产品推荐
相关产品推荐

