WooCommerce商品价格关联购物车数量触发严重错误求助
解决WooCommerce中调用购物车数量触发严重错误的问题
问题根源分析
你的代码出现严重错误主要有两个核心原因:
- 变量顺序逻辑颠倒:原代码中先调用未定义的
$post_id去获取商品,之后才给$post_id赋值,同时还覆盖了钩子传递的$product参数,完全不符合执行逻辑。 - 购物车初始化时机冲突:
woocommerce_get_price钩子会在后台商品编辑、批量操作、前台商品首次加载等多个场景触发,这些场景中WC()->cart可能还未初始化,直接调用其方法会触发致命错误。
修正后的代码
function return_custom_price($price, $product) { // 仅在前台生效,避开后台未初始化购物车的场景 if (is_admin() && !defined('DOING_AJAX')) { return $price; } // 检查购物车是否已初始化,避免调用不存在的对象方法 if (null === WC()->cart) { return $price; } $target_product_id = 1397; // 直接使用钩子传递的product对象获取ID,无需依赖全局$post if ($product->get_id() === $target_product_id) { $cart_item_count = WC()->cart->get_cart_contents_count(); // 确保价格至少为1,避免购物车为空时价格为0(可根据需求调整) $price = max(1, $cart_item_count); } return $price; } add_filter('woocommerce_get_price', 'return_custom_price', 10, 2);
关键修正点说明
- 限定生效场景:通过
is_admin()判断,只在前台执行价格修改逻辑,彻底避免后台操作时的购物车未初始化问题。 - 购物车存在校验:提前检查
WC()->cart是否存在,防止在前台某些特殊场景(比如首次访问商品页,购物车还未创建)触发错误。 - 正确使用钩子参数:直接利用钩子传递的
$product对象获取商品ID,不需要依赖不稳定的全局$post变量,逻辑更可靠。 - 清理无效代码:删掉了原代码中无意义的
$blog_id变量,以及错误的$product重赋值操作。
后续扩展提示(针对排除特定品类需求)
如果之后需要排除特定品类的商品数量统计,可以替换购物车数量的获取逻辑:
// 替换原$cart_item_count的获取代码 $cart_item_count = 0; foreach (WC()->cart->get_cart() as $cart_item) { $item_product = $cart_item['data']; // 替换为你需要排除的品类slug或ID if (!$item_product->has_term('需要排除的品类slug', 'product_cat')) { $cart_item_count += $cart_item['quantity']; } }
内容的提问来源于stack exchange,提问作者cheshiredave
相关产品推荐
相关产品推荐

