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

WooCommerce结账页面支付失败:Critical Uncaught Error问题排查求助

问题分析与修复方案

首先,你的致命错误根源非常清晰,同时代码里还有几处可以优化的细节,我们一步步解决:

1. 直接触发错误的核心原因

你代码里的这一行:

$Sperson = $item_val->get_meta( 'Sales Person', true );

犯了变量名拼写错误——你的函数参数里传递的订单项变量是$item,但你误用了不存在的$item_val,这就导致调用get_meta()时触发了Call to a member function get_meta() on null的致命错误,直接中断了结账流程。

2. 完整修复后的代码

除了修正变量名,我们还优化了几处WooCommerce的最佳实践细节,避免潜在问题:

add_action('woocommerce_checkout_create_order_line_item','rw4y_add_custom_order_line_item_meta',10,4);
function rw4y_add_custom_order_line_item_meta($item, $cart_item_key, $values, $order){
    // 先检查购物车项中存在有效销售人员ID
    if (array_key_exists('shop_manager_id', $values) && !empty($values['shop_manager_id'])) {
        $shop_manager_id = $values['shop_manager_id'];
        $shop_obj = get_user_by('id', $shop_manager_id);
        
        // 确保用户对象有效,避免无效ID引发额外错误
        if ($shop_obj) {
            // 添加订单项级别的元数据
            $item->add_meta_data('SID', $shop_manager_id);
            $sales_person_text = "[{$shop_manager_id}] - {$shop_obj->display_name}";
            $item->add_meta_data('Sales Person', $sales_person_text);
            
            // 更新订单级别的元数据(仅当未设置时)
            $order_id = $order->get_id(); // WooCommerce 3.0+推荐用getter方法获取ID
            if (empty(get_post_meta($order_id, 'SID', true))) {
                update_post_meta($order_id, 'SID', $shop_manager_id);
                update_post_meta($order_id, 'Sales Person', $sales_person_text);
            }
        }
    }
}

3. 修复细节说明

  • 修正变量名错误:去掉了不存在的$item_val,直接复用已经构建好的$sales_person_text,不需要额外调用get_meta()
  • 增加用户对象有效性检查:防止无效的销售人员ID引发新的错误
  • 替换$order->id为$order->get_id():符合WooCommerce 3.0+的规范,避免废弃属性带来的兼容性问题
  • 简化逻辑:直接使用已拼接好的销售人员文本更新订单元数据,减少不必要的函数调用

这个修复版本既保留了你需要的「订单邮件显示销售人员信息」功能,又能彻底解决结账时的致命错误,恢复正常支付流程。

内容的提问来源于stack exchange,提问作者bh9999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:12:44