基于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' );
关键细节说明
- 可配置化设计:把所有规则参数(国家、分类、费用金额)集中放在顶部,后续修改只需要改这里,不用碰逻辑代码,非常方便维护。
- 国家判断逻辑:优先取用户的收货国家,没有的话 fallback 到账单国家,确保判断准确。
- 分类检查:使用
has_term函数,支持传入分类SLUG或ID数组,兼容不同的分类管理方式。 - 叠加规则支持:意大利的10€费用是和欧洲分类套餐费用叠加的,比如意大利用户买1件分类1的中型套餐,总额外费用是30+10=40€,完全符合你的需求。
- 数量适配:所有费用都乘以商品数量,确保多件商品的费用计算正确。
- 后台安全判断:添加了
is_admin()判断,避免在WordPress后台执行该逻辑导致不必要的错误。
使用注意事项
- 请把代码中的
cat-1/cat-2等分类标识替换为你实际的产品分类SLUG或ID。 - 可以修改
套餐服务费为你需要的费用显示名称,支持多语言翻译。 - 如果不需要费用含税,可以把
add_fee函数的第三个参数改为false。
内容的提问来源于stack exchange,提问作者Cristina Collins
相关产品推荐
相关产品推荐

