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

