WooCommerce按账单州设置新订单邮件收件人代码失效排查求助
错误排查与代码修正
核心错误点
- 数组语法错误:
'GT'对应行末尾多了一个多余的单引号和逗号(',),直接导致PHP代码解析失败,整个逻辑无法运行,邮件通知自然失效。 - 未处理未知州代码场景:如果订单的账单州代码不在定义的数组中,
matriz_estados函数会返回无效值,WooCommerce因收件人不合法停止发送邮件。 - 收件人覆盖逻辑不严谨:原代码直接替换收件人,未保留默认收件人选项,可能导致特殊情况邮件丢失。
修正后的完整代码
// PART 1 // 定义墨西哥各州对应的收件人邮箱数组 function matriz_estados( $ubica_estado ) { $destinatarios = array( 'MO' => 'MO-salesperson@domain.com, state-manager@domain.com', 'CL' => 'CL-salesperson@domain.com, state-manager@domain.com', 'GT' => 'GT-salesperson@domain.com, state-manager@domain.com' // 其他州按格式继续添加... ); // 仅当州代码存在于数组中时返回对应收件人,否则返回null return isset( $destinatarios[$ubica_estado] ) ? $destinatarios[$ubica_estado] : null; } // PART 2 // 根据订单账单州获取对应收件人,修改新订单邮件收件人 add_filter( 'woocommerce_email_recipient_new_order', 'define_receptor', 9999, 3 ); function define_receptor( $email_recipient, $order_object, $email ) { // 无有效订单对象时,直接返回原收件人 if ( ! $order_object ) { return $email_recipient; } $ubica_estado = $order_object->get_billing_state(); $custom_recipient = matriz_estados( $ubica_estado ); // 存在自定义收件人时,合并原收件人(如需仅保留自定义收件人,直接替换即可) if ( $custom_recipient ) { $email_recipient = $email_recipient . ', ' . $custom_recipient; } return $email_recipient; }
关键修正说明
- 移除数组中多余的语法错误字符,确保PHP代码正常解析。
- 增加
isset()判断,避免因未知州代码返回无效值导致邮件发送失败。 - 调整收件人逻辑,默认保留原收件人并合并自定义收件人(可根据需求改为直接替换),防止特殊场景下邮件丢失。
- 补充订单对象有效性判断,提升代码鲁棒性。
内容的提问来源于stack exchange,提问作者Idea W
相关产品推荐
相关产品推荐

