WooCommerce添加用户邮箱至新订单通知收件人遇后台报错求助
WooCommerce新订单邮件添加联系邮箱的错误修复
原代码的问题
- 函数参数明明传的是
$order对象,代码里却用了未定义的$order_id,调用wc_get_order($order_id)直接触发致命错误 - 未做判断就直接调用
get_userdata()->user_email,手动创建的订单如果没关联用户(user_id为0),get_userdata(0)返回false,此时取user_email会引发报错 - 重复获取订单对象,完全没必要,参数里已经有现成的
$order
修正后的可用代码
function add_additional_email_recipient( $recipient, $order ) { // 先确认订单对象有效 if ( ! is_a( $order, 'WC_Order' ) ) { return $recipient; } $user_id = $order->get_user_id(); // 用户ID有效时才获取邮箱 if ( $user_id > 0 ) { $user_data = get_userdata( $user_id ); if ( $user_data && ! empty( $user_data->user_email ) ) { // 防止重复添加同一个邮箱 if ( strpos( $recipient, $user_data->user_email ) === false ) { $recipient .= ',' . $user_data->user_email; } } } return $recipient; } add_filter( 'woocommerce_email_recipient_new_order', 'add_additional_email_recipient', 10, 2 );
针对手动订单的额外优化
如果手动创建订单时填写的联系邮箱不是用户账号邮箱,而是单独的自定义字段,加上这段逻辑就能同时获取该邮箱:
function add_additional_email_recipient( $recipient, $order ) { if ( ! is_a( $order, 'WC_Order' ) ) { return $recipient; } // 添加用户账号邮箱(如果存在) $user_id = $order->get_user_id(); if ( $user_id > 0 ) { $user_data = get_userdata( $user_id ); if ( $user_data && ! empty( $user_data->user_email ) ) { if ( strpos( $recipient, $user_data->user_email ) === false ) { $recipient .= ',' . $user_data->user_email; } } } // 添加订单的联系邮箱(手动填写的字段) $billing_email = $order->get_billing_email(); // 这里的_meta键换成你实际用的联系邮箱字段键名,比如_contact_email $contact_email = $order->get_meta( '_billing_email' ); if ( ! empty( $contact_email ) && $contact_email !== $billing_email ) { if ( strpos( $recipient, $contact_email ) === false ) { $recipient .= ',' . $contact_email; } } return $recipient; } add_filter( 'woocommerce_email_recipient_new_order', 'add_additional_email_recipient', 10, 2 );
几点提醒
- 修改
functions.php前一定要备份文件,避免操作失误导致网站故障 - 手动订单的联系邮箱字段键名要对应准确,不确定的话可以用自定义字段插件查看或开启调试模式查看meta数据
- 测试时可开启WP_DEBUG模式,能看到具体错误信息,便于排查问题
内容的提问来源于stack exchange,提问作者Alex Seguin
相关产品推荐
相关产品推荐

