You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:16:01