WooCommerce可变商品数量步进规则失效问题排查与修复
WooCommerce可变商品数量步进规则失效问题解决
问题描述
在WooCommerce店铺中,通过商品slug设置固定数量步进值(如6、3),代码在单商品页面正常生效,但可变商品页面失效,出现添加第7件后再按6步进的异常情况。原代码如下:
add_filter( 'woocommerce_quantity_input_args', 'quantity_selected_number', 10, 2 ); function quantity_selected_number( $args, $product ) { //global $product; if ( ! is_cart() ) { if ($product->get_slug()=="product-01-slug"){ $args['input_value'] = 6; // Start from this value (default = 1) $args['max_value'] = 600; // Maximum quantity (default = -1) $args['min_value'] = 6; // Minimum quantity (default = 0) $args['step'] = 6; // Increment or decrement by this value (default = 1) } } if ($product->get_slug()=="product-02-slug"){ // Cart's 'min_value' is 0 $args['input_value'] = 3; $args['max_value'] = 260; $args['step'] = 3; $args['min_value'] = 3; } if ($product->get_slug()=="product-03-slug"){ // Cart's 'min_value' is 0 $args['input_value'] = 3; $args['max_value'] = 260; $args['step'] = 3; $args['min_value'] = 3; } return $args; }
问题原因
- 变体产品slug判断失效:可变商品页面选中变体后,
$product对象指向子变体而非父商品。若变体slug与父商品slug不一致,原代码的slug判断无法匹配,导致规则不生效。 - 未同步变体核心数据:可变商品的数量控件依赖前端JS读取
woocommerce_available_variation返回的变体数据(如min_qty、step),原代码仅修改了初始数量输入参数,未更新变体的核心数据,前端仍使用默认步进规则。 - 逻辑不一致:原代码中
!is_cart的判断仅包裹了product-01-slug的设置,其余商品规则不受购物车状态限制,易引发逻辑冲突。
解决代码
以下代码修复了上述问题,同时优化了逻辑结构:
// 辅助函数:根据产品(或父产品)slug获取数量规则 function get_product_quantity_rules( $product ) { // 若为变体产品,获取父商品的slug $target_slug = $product->is_type('variation') ? wc_get_product($product->get_parent_id())->get_slug() : $product->get_slug(); $rules = []; switch( $target_slug ) { case 'product-01-slug': $rules = [ 'input_value' => 6, 'max_value' => 600, 'min_value' => 6, 'step' => 6 ]; break; case 'product-02-slug': case 'product-03-slug': $rules = [ 'input_value' => 3, 'max_value' => 260, 'min_value' => 3, 'step' => 3 ]; break; } return $rules; } // 修改数量输入参数 add_filter( 'woocommerce_quantity_input_args', 'custom_quantity_input_args', 10, 2 ); function custom_quantity_input_args( $args, $product ) { $rules = get_product_quantity_rules( $product ); if( empty($rules) ) return $args; // 购物车页面min_value设为0(避免无法减少数量) if( is_cart() ) { $rules['min_value'] = 0; unset($rules['input_value']); // 保留购物车中已选数量 } return array_merge( $args, $rules ); } // 更新可变商品的变体数据 add_filter( 'woocommerce_available_variation', 'custom_variation_quantity_rules', 10, 3 ); function custom_variation_quantity_rules( $variation_data, $product, $variation ) { $rules = get_product_quantity_rules( $variation ); if( empty($rules) ) return $variation_data; // 同步变体的数量规则参数 $variation_data['min_qty'] = $rules['min_value']; $variation_data['max_qty'] = $rules['max_value']; $variation_data['step'] = $rules['step']; return $variation_data; }
代码说明
- 辅助函数复用逻辑:通过
get_product_quantity_rules统一处理slug判断,自动识别变体产品并使用父商品slug匹配规则,避免重复代码。 - 适配购物车场景:购物车页面自动将
min_value设为0,允许用户减少数量,同时保留已选的输入值。 - 同步变体数据:通过
woocommerce_available_variation过滤器,将数量规则写入变体的核心数据,确保前端JS能正确读取步进规则,解决可变商品页面的异常问题。
内容的提问来源于stack exchange,提问作者Íako
相关产品推荐
相关产品推荐

