更新WooCommerce/WordPress后调用add_error()成员函数报错求助
WooCommerce结账页面PHP致命错误问题分析与解决
问题原因
从错误栈追踪和代码可明确问题根源:WooCommerce版本更新后,woocommerce_after_checkout_validation钩子的参数顺序发生了变更。
- 旧版本中该钩子的第一个参数是错误处理对象,你的代码原本基于此逻辑开发;
- 更新后的新版本里,该钩子的参数顺序调整为:第一个是结账字段数组,第二个才是用于添加验证错误的
WP_Error实例; - 你的代码仍把第一个传入的数组当作错误对象调用
add_error()方法,直接触发「Call to a member function add_error() on array」的致命错误。
修复步骤
1. 修改验证函数的参数与逻辑
更新validate_extra_fields函数,适配新的参数顺序并使用正确的错误对象:
/** * Validate the extra fields on the checkout page. * * @param array $fields Checkout fields array * @param WP_Error $errors Error object for adding validation errors */ public function validate_extra_fields($fields, $errors) { // 推荐用WooCommerce内置方法获取提交数据,替代直接调用$_POST $posted_data = WC()->checkout->get_posted_data(); $shipping_email = isset($posted_data['shipping_email']) ? $posted_data['shipping_email'] : ''; $shipping_phone = isset($posted_data['shipping_phone']) ? $posted_data['shipping_phone'] : ''; if (empty($shipping_email)) { $errors->add('shipping_email', 'Please insert your email address'); } elseif (!is_email($shipping_email)) { $errors->add('shipping_email', 'Email format is invalid'); } if (empty($shipping_phone)) { $errors->add('shipping_phone', 'Please insert your phone number'); } }
注意:新版本的该钩子无需返回值,直接通过
$errors对象添加错误即可。
2. 确保钩子注册时指定接收2个参数
检查你注册该钩子的代码,必须添加第四个参数2(表示接收2个参数):
add_action('woocommerce_after_checkout_validation', [$this, 'validate_extra_fields'], 10, 2);
若之前的钩子注册仅传入前三个参数(优先级10),必须补充第四个参数2,否则函数只会接收到第一个参数(字段数组),第二个参数$errors会为null。
内容的提问来源于stack exchange,提问作者Zarbat
相关产品推荐
相关产品推荐

