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

