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

基于WooCommerce产品分类与用户国家添加额外费用的技术问题

适配多分类+多国家的WooCommerce额外费用解决方案

我帮你重构了代码,完美实现你需要的分层额外费用规则,同时让代码更易维护,后续修改规则不用动核心逻辑。

核心需求拆解

  • 欧洲国家:
    • 分类1/2/3的中型套餐:每件加30€
    • 分类4/5/6的大型套餐:每件加50€
  • 意大利:所有分类的产品,每件额外再加10€(和欧洲规则叠加生效)

修改后的完整代码

function df_add_ticket_surcharge( $cart_object ) {
    // 避免在WordPress后台执行该逻辑
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    // --------------------------
    // 可配置规则区(按需修改)
    // --------------------------
    $european_countries = [
        'AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 
        'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 
        'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 
        'SE', 'SI', 'SK'
    ]; // 欧盟国家代码
    $medium_package_cats = ['cat-1', 'cat-2', 'cat-3']; // 替换为你的分类SLUG/ID
    $large_package_cats = ['cat-4', 'cat-5', 'cat-6']; // 替换为你的分类SLUG/ID
    $italy_extra_fee = 10;
    $medium_package_fee = 30;
    $large_package_fee = 50;
    // --------------------------

    // 获取用户的收货国家(优先)或账单国家
    $user_country = WC()->customer->get_shipping_country();
    if ( empty($user_country) ) {
        $user_country = WC()->customer->get_billing_country();
    }

    $total_surcharge = 0;

    // 遍历购物车中每个商品计算费用
    foreach ( $cart_object->get_cart() as $item ) {
        $product = $item['data'];
        $qty = $item['quantity'];
        $product_id = $product->get_id();

        // 欧洲国家分类套餐费用
        if ( in_array($user_country, $european_countries) ) {
            // 检查是否属于中型套餐分类
            if ( has_term($medium_package_cats, 'product_cat', $product_id) ) {
                $total_surcharge += $medium_package_fee * $qty;
            } 
            // 检查是否属于大型套餐分类
            elseif ( has_term($large_package_cats, 'product_cat', $product_id) ) {
                $total_surcharge += $large_package_fee * $qty;
            }
        }

        // 意大利额外叠加费用(所有分类)
        if ( $user_country === 'IT' ) {
            $total_surcharge += $italy_extra_fee * $qty;
        }
    }

    // 如果有额外费用,添加到购物车
    if ( $total_surcharge > 0 ) {
        $cart_object->add_fee( 
            __( '套餐服务费', 'woocommerce' ), 
            $total_surcharge, 
            true, // 是否含税(true=含税,false=不含税)
            'standard' // 适用税率类型
        );
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'df_add_ticket_surcharge' );

关键细节说明

  1. 可配置化设计:把所有规则参数(国家、分类、费用金额)集中放在顶部,后续修改只需要改这里,不用碰逻辑代码,非常方便维护。
  2. 国家判断逻辑:优先取用户的收货国家,没有的话 fallback 到账单国家,确保判断准确。
  3. 分类检查:使用has_term函数,支持传入分类SLUG或ID数组,兼容不同的分类管理方式。
  4. 叠加规则支持:意大利的10€费用是和欧洲分类套餐费用叠加的,比如意大利用户买1件分类1的中型套餐,总额外费用是30+10=40€,完全符合你的需求。
  5. 数量适配:所有费用都乘以商品数量,确保多件商品的费用计算正确。
  6. 后台安全判断:添加了is_admin()判断,避免在WordPress后台执行该逻辑导致不必要的错误。

使用注意事项

  • 请把代码中的cat-1/cat-2等分类标识替换为你实际的产品分类SLUG或ID。
  • 可以修改套餐服务费为你需要的费用显示名称,支持多语言翻译。
  • 如果不需要费用含税,可以把add_fee函数的第三个参数改为false。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:54:46