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

WooCommerce排除指定分类按商品数量设置结账自定义费用问题

WooCommerce 自定义结账费用(排除指定分类)代码修正

原代码问题分析

  1. 变量名不一致:初始化的计数变量是$cart_item_count,但循环累加时误用了未定义的$items_count,导致计数始终为0,费用逻辑无法触发。
  2. 全局调用冗余:函数参数已传入$cart对象,无需再用WC()->cart调用购物车,直接使用参数更高效规范。
  3. 产品分类检查优化:直接使用$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:15:15