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

如何为WooCommerce不同分类产品添加多个自定义费用?

WooCommerce多分类自定义附加费解决方案

直接可用的修正代码

function df_add_ticket_surcharge( $cart ) {
    // 后台非AJAX请求时跳过,避免不必要计算
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    // 把需要加费的分类和对应单件费用存在数组里,后续加新分类直接加行就行
    $category_fee_map = array(
        39 => 3.60,
        38 => 1.80
    );

    $total_surcharge = 0;

    // 遍历购物车每一件商品
    foreach ( $cart->cart_contents as $item ) {
        $product_id = $item['product_id'];
        $qty = $item['quantity'];
        
        // 获取商品所属分类
        $product_cats = get_the_terms( $product_id, 'product_cat' );
        if ( $product_cats && ! is_wp_error( $product_cats ) ) {
            foreach ( $product_cats as $cat ) {
                // 如果当前商品属于要加费的分类,累加费用
                if ( isset( $category_fee_map[ $cat->term_id ] ) ) {
                    $total_surcharge += $qty * $category_fee_map[ $cat->term_id ];
                    // 一个商品如果同时在多个加费分类里,只算一次(要叠加的话删掉break)
                    break;
                }
            }
        }
    }

    // 总费用大于0就添加到购物车
    if ( $total_surcharge > 0 ) {
        $cart->add_fee( 'Statiegeld', $total_surcharge, true, 'standard' );
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'df_add_ticket_surcharge' );

问题原因&修改说明

  1. 原代码的局限:你原来的代码只能处理单个分类,而且每次匹配到分类39的商品时,会直接覆盖费用变量——如果购物车里有多个符合条件的商品,最后只会计算最后一个的费用,自然没法支持第二个分类。
  2. 复制代码报错的原因:直接复制原函数会导致重复声明同名函数,WordPress不允许同一个函数被注册两次,直接触发致命错误。
  3. 核心优化点:
    • 用数组统一管理分类与对应费率,后续新增分类只需在数组中加一行,无需修改逻辑;
    • 改为累加总费用,不再覆盖变量,能正确计算所有符合条件的商品费用;
    • 移除冗余的global $woocommerce,直接使用钩子传入的$cart对象,更符合WooCommerce开发规范;
    • 增加后台判断,避免在WP后台操作时触发不必要的费用计算。

内容的提问来源于stack exchange,提问作者dosrox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:13:13