WooCommerce排除指定分类按商品数量设置结账自定义费用问题
WooCommerce 自定义结账费用(排除指定分类)代码修正
原代码问题分析
- 变量名不一致:初始化的计数变量是
$cart_item_count,但循环累加时误用了未定义的$items_count,导致计数始终为0,费用逻辑无法触发。 - 全局调用冗余:函数参数已传入
$cart对象,无需再用WC()->cart调用购物车,直接使用参数更高效规范。 - 产品分类检查优化:直接使用
$item['product_id']可能对变体产品分类判断不准确,改用购物车项的产品对象进行检查更可靠。
修正后的代码
add_action( 'woocommerce_cart_calculate_fees','woocommerce_cart_extra_cost', 10, 1 ); function woocommerce_cart_extra_cost( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // 要排除的商品分类别名(slug) $excluded_terms = array('tickets', 'vouchers'); $cart_item_count = 0; // 初始化计数 // 遍历购物车商品 foreach ( $cart->get_cart() as $item ) { $product = $item['data']; // 获取当前商品对象 // 排除指定分类的商品,只统计其他分类的商品数量 if ( ! has_term( $excluded_terms, 'product_cat', $product ) ) { $cart_item_count += $item['quantity']; } } // 根据商品数量设置费用 if( $cart_item_count < 6 ) { $fee = 0; } elseif( $cart_item_count >= 6 && $cart_item_count < 11 ) { $fee = 3; } else { // 数量≥11 $fee = 5; } // 费用大于0时添加到结账流程 if( $fee > 0 ) { $cart->add_fee( __( "处理费", "woocommerce" ), $fee, true); } }
代码说明
- 变量名统一为
$cart_item_count,确保计数逻辑正常运行。 - 使用函数传入的
$cart对象调用购物车项,避免全局依赖。 - 通过
$item['data']获取商品对象,确保变体产品的分类判断准确。 - 费用规则:6-10件收取3元处理费,11件及以上收取5元,5件及以下不收费。
- 排除
tickets和vouchers分类的商品,这些商品不会被计入数量统计。
内容的提问来源于stack exchange,提问作者user1381985
相关产品推荐
相关产品推荐

