如何为WooCommerce指定产品类目添加7.40元收据通知费并排除部分类目
WooCommerce 实现全类目加收收据通知费(排除指定类目)
原代码存在的问题
- 逻辑倒置:原代码是仅指定类目加收费用,但需求是全类目加收,排除指定类目
- 产品类目获取错误:
$item['product_cat']不是WooCommerce购物车项的标准属性,无法正确获取产品所属类目ID - 重复计费:遍历购物车时,每个符合条件的商品都会添加一次费用,导致金额重复累加
- 费用金额与名称不符合需求:原金额是5元,名称为“Additional Charge”,需改为7.4元的“收据通知费”
修正后的代码
add_action('woocommerce_cart_calculate_fees', 'add_receipt_notification_fee_exclude_categories'); function add_receipt_notification_fee_exclude_categories() { // 后台非AJAX请求时不执行 if (is_admin() && !defined('DOING_AJAX')) return; // 定义需要排除的类目ID数组 $excluded_cat_ids = array(600, 650, 700); $should_add_fee = false; // 遍历购物车中的每个商品 foreach (WC()->cart->get_cart() as $item) { $product = $item['data']; // 获取产品所属的所有商品类目ID $product_cat_ids = wp_list_pluck(get_the_terms($product->get_id(), 'product_cat'), 'term_id'); // 检查当前商品是否不在排除类目里 if (!array_intersect($product_cat_ids, $excluded_cat_ids)) { $should_add_fee = true; break; // 只要有一个商品符合,就标记需要加费,无需继续遍历 } } // 如果需要加费,添加7.4元的收据通知费 if ($should_add_fee) { WC()->cart->add_fee(__('收据通知费'), 7.40); } }
代码关键说明
- 排除类目设置:修改
$excluded_cat_ids数组中的ID即可调整需要排除的类目 - 避免重复计费:通过
$should_add_fee标记,只要购物车中有一个商品不属于排除类目,就只添加一次费用 - 正确获取类目ID:使用
get_the_terms获取产品的商品类目,再通过wp_list_pluck提取ID数组,确保类目判断准确 - 费用配置:
add_fee函数中第一个参数是费用名称(支持多语言),第二个参数是费用金额
内容的提问来源于stack exchange,提问作者Mael Costa
相关产品推荐
相关产品推荐

