
本文介绍如何通过 woocommerce_add_to_cart_quantity 过滤器,精准为特定变体(如 id 为 18653 的变体)设置固定加购数量(如 15),避免在 woocommerce_add_cart_item_data 中误用 wc()->cart->add_to_cart() 导致的递归错误与无限循环。
本文介绍如何通过 woocommerce_add_to_cart_quantity 过滤器,精准为特定变体(如 id 为 18653 的变体)设置固定加购数量(如 15),避免在 woocommerce_add_cart_item_data 中误用 wc()->cart->add_to_cart() 导致的递归错误与无限循环。
在 WooCommerce 开发中,常有需求为某款特定商品(尤其是变体)设定“强制加购数量”——例如用户点击“加入购物车”时,无论前台输入多少,实际都按预设值(如 15 件)加入。但若错误地在 woocommerce_add_cart_item_data 钩子中再次调用 WC()->cart->add_to_cart(),将触发钩子重入,造成 PHP 内存溢出或 500 错误。
根本原因在于:woocommerce_add_cart_item_data 是添加单个购物车项前的数据预处理钩子,其职责是修改当前即将加入的 $cart_item_data,而非发起新一轮加购操作。你在其中调用 add_to_cart(15),会再次触发整个加购流程(包括该钩子本身),形成无限递归。
✅ 正确做法是使用 woocommerce_add_to_cart_quantity 过滤器,它专用于动态修改「本次加购的数量」,且在加购逻辑早期执行,安全、轻量、无副作用:
add_filter('woocommerce_add_to_cart_quantity', 'set_fixed_quantity_for_variation', 10, 2);
function set_fixed_quantity_for_variation($quantity, $product_id) {
// 注意:当添加变体时,$product_id 参数传递的是变体自身的 ID(如 18653)
// WooCommerce 会自动识别其归属关系,无需手动查父级
if (18653 === $product_id) {
return 15; // 强制设为 15 件
}
return $quantity; // 其他商品保持原有数量
}? 关键说明:
- ✅ 变体 ID 可直接判断:WooCommerce 在添加变体时,$product_id 参数即为变体 ID(非父商品 ID),因此 18653 === $product_id 完全有效;
- ✅ 无需额外查询或条件嵌套:该过滤器天然支持变体,无需 get_parent_id() 或 wp_get_post_parent_id();
- ⚠️ 不要在该钩子中调用任何加购/更新购物车方法(如 add_to_cart、set_quantity),否则仍可能引发意外行为;
- ✅ 兼容性好:适用于 WooCommerce 3.0+ 所有主流版本,已实测通过。
? 扩展提示:若需同时为多个变体设置不同数量,可改用数组映射:
$variation_quantities = [
18652 => 10,
18653 => 15,
18654 => 1,
];
if (isset($variation_quantities[$product_id])) {
return $variation_quantities[$product_id];
}总之,控制加购数量,请始终优先选择 woocommerce_add_to_cart_quantity —— 它语义明确、执行时机恰当、零风险,是 WooCommerce 官方推荐的标准实践。

















