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
相关产品推荐
相关产品推荐

