WooCommerce:购物车含特定变体ID商品时添加50元附加费失败
问题分析与修复方案
原代码未生效的核心原因有两点:
- 依赖
WC()->cart全局对象而非钩子传入的$cart参数,在部分AJAX或异步场景下会出现上下文错误 - 使用
generate_cart_id+find_product_in_cart的匹配方式不够可靠,当商品存在额外属性(如自定义属性)时,生成的购物车ID会和实际存储的ID不匹配,导致无法检测到目标商品
另外代码里还有两处不符合需求的细节:
- 附加费文本显示的是「数量折扣」,和需求的自定义提示不符
- 变量
$percentage命名错误,因为需求是固定50元附加费,并非百分比
修复后的代码
add_action( 'woocommerce_cart_calculate_fees', 'add_custom_product_surcharge', 30, 1 ); function add_custom_product_surcharge( $cart ) { // 后台非AJAX场景直接返回 if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; $target_product_id = 1761; $target_variation_id = 1853; $surcharge_amount = 50; $surcharge_label = '特定商品附加费'; // 自定义显示文本 // 遍历购物车物品,检查是否存在目标商品 foreach ( $cart->get_cart() as $cart_item ) { $product = $cart_item['data']; // 匹配主商品ID和变体ID if ( $product->get_id() === $target_product_id && $cart_item['variation_id'] === $target_variation_id ) { // 添加附加费,正数为额外收费 $cart->add_fee( __($surcharge_label, 'woocommerce'), $surcharge_amount ); break; // 找到目标商品后停止遍历 } } }
代码说明
- 使用钩子传入的
$cart参数:避免全局对象调用的上下文问题,确保在所有购物车计算场景下都能正常工作 - 遍历购物车物品匹配:直接检查每个购物车项的主商品ID和变体ID,匹配逻辑更可靠,不受商品属性影响
- 自定义文本与固定金额:明确设置附加费的显示文本和金额,符合需求要求
- 提前终止遍历:找到目标商品后立即停止循环,提升性能
内容的提问来源于stack exchange,提问作者JohnK
相关产品推荐
相关产品推荐

