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

WooCommerce问题:商品已在购物车时如何增加其数量

WooCommerce购物车商品数量更新无限循环问题修复

错误原因分析

你的代码触发无限循环,核心问题出在钩子触发的递归调用:

  • 如果你把这段代码挂在了woocommerce_add_to_cart这类钩子上,调用WC()->cart->set_quantity()时会再次触发同一个钩子,导致代码反复执行,陷入无限循环。
  • 另外,手动遍历购物车的方式虽然逻辑没问题,但WooCommerce有更高效的内置方法查找购物车商品,没必要重复造轮子。

修正方案

方案1:用非递归钩子+内置方法定位商品

选择woocommerce_before_add_to_cart_form这类仅在添加商品前执行一次的钩子,同时用WC()->cart->find_product_in_cart()直接定位购物车中的商品,避免手动遍历:

add_action('woocommerce_before_add_to_cart_form', 'update_existing_cart_item_quantity');
function update_existing_cart_item_quantity() {
    global $customer_gets_as_free, $main_product_id;

    if ('same_product_added_to_cart' === $customer_gets_as_free && is_array($main_product_id)) {
        foreach ($main_product_id as $main_product_single) {
            $product_id = intval($main_product_single);
            // 直接生成商品ID并查找对应购物车项
            $cart_item_key = WC()->cart->find_product_in_cart(WC()->cart->generate_cart_id($product_id));
            
            if ($cart_item_key) {
                $current_qty = WC()->cart->get_cart_item($cart_item_key)['quantity'];
                WC()->cart->set_quantity($cart_item_key, $current_qty + 1);
                // 更新购物车总价与会话数据
                WC()->cart->calculate_totals();
            }
        }
    }
}

方案2:临时移除钩子避免递归

如果必须使用woocommerce_add_to_cart这类会被更新操作触发的钩子,执行更新前要临时移除钩子,防止递归调用:

add_action('woocommerce_add_to_cart', 'update_existing_cart_item_quantity', 10, 6);
function update_existing_cart_item_quantity($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    global $customer_gets_as_free, $main_product_id;

    if ('same_product_added_to_cart' !== $customer_gets_as_free || !is_array($main_product_id)) {
        return;
    }

    // 临时移除当前钩子,避免set_quantity触发递归
    remove_action('woocommerce_add_to_cart', __FUNCTION__, 10);

    foreach ($main_product_id as $main_product_single) {
        $target_product_id = intval($main_product_single);
        $target_cart_key = WC()->cart->find_product_in_cart(WC()->cart->generate_cart_id($target_product_id));
        
        if ($target_cart_key) {
            $current_qty = WC()->cart->get_cart_item($target_cart_key)['quantity'];
            WC()->cart->set_quantity($target_cart_key, $current_qty + 1);
            WC()->cart->calculate_totals();
        }
    }

    // 恢复钩子,保证后续正常触发
    add_action('woocommerce_add_to_cart', __FUNCTION__, 10, 6);
}

额外注意事项

  • 确认$main_product_id是有效的商品ID数组,避免无效值导致代码不执行。
  • 调用set_quantity后必须执行calculate_totals(),否则购物车的总价和前端显示不会同步更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:52:24