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

WooCommerce商品价格关联购物车数量触发严重错误求助

解决WooCommerce中调用购物车数量触发严重错误的问题

问题根源分析

你的代码出现严重错误主要有两个核心原因:

  1. 变量顺序逻辑颠倒:原代码中先调用未定义的$post_id去获取商品,之后才给$post_id赋值,同时还覆盖了钩子传递的$product参数,完全不符合执行逻辑。
  2. 购物车初始化时机冲突: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:52:52