WooCommerce购物车阶梯折扣:指定商品+优惠券触发实现问询
嘿,我来帮你搞定这两个需求!首先得修正你原代码里的一个小逻辑问题——折扣档位的判断顺序反了,会导致高额度的折扣无法生效,然后咱们再一步步加上指定商品和手动触发的功能:
问题1:仅将折扣应用于指定商品
要实现只给特定商品计算折扣,我们需要先定义目标商品ID数组,然后遍历购物车,累加这些商品的总金额,用这个金额来计算折扣,而不是整个购物车的总额。
问题2:设置手动触发(输入优惠券码才生效)
我们可以指定一个专属优惠券码,只有当用户在购物车中应用了这个优惠券时,折扣才会触发。需要检查购物车中已应用的优惠券是否包含我们指定的码。
完整修改后的代码
add_action( 'woocommerce_cart_calculate_fees', 'discount_based_on_target_products_with_coupon', 25, 1 ); function discount_based_on_target_products_with_coupon( $cart ) { // 后台且非AJAX请求时不执行 if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // --- 可自定义配置区 --- $target_product_ids = array(123, 456); // 替换成你的指定商品ID $required_coupon_code = 'VIP_STEP_DISCOUNT'; // 替换成你要使用的专属优惠券码 $discount_tiers = array( array('min_amount' => 500000, 'percent' => 0.20), array('min_amount' => 350000, 'percent' => 0.15), array('min_amount' => 200000, 'percent' => 0.10), ); // --- 配置结束 --- // 检查是否应用了指定优惠券,没应用直接退出 $applied_coupons = $cart->get_applied_coupons(); if ( ! in_array( $required_coupon_code, $applied_coupons ) ) { return; } // 计算指定商品的总金额(不含税,如需含税可替换为line_subtotal + line_subtotal_tax) $target_total = 0; foreach ( $cart->get_cart() as $cart_item ) { $product_id = $cart_item['product_id']; if ( in_array( $product_id, $target_product_ids ) ) { $target_total += $cart_item['line_subtotal']; } } // 从高到低匹配折扣档位,确保最高优先级的折扣生效 $discount = 0; foreach ( $discount_tiers as $tier ) { if ( $target_total >= $tier['min_amount'] ) { $discount = $target_total * $tier['percent']; break; } } // 添加折扣(负数表示优惠) if ( $discount > 0 ) { $cart->add_fee( __('阶梯折扣', 'woocommerce'), -$discount ); } }
关键逻辑说明
- 指定商品控制:通过
$target_product_ids数组定义需要享受折扣的商品,遍历购物车时只累加这些商品的金额,确保折扣仅作用于目标商品。 - 手动触发控制:只有当用户在购物车中应用了
$required_coupon_code指定的优惠券时,折扣逻辑才会执行,实现手动触发效果。 - 修复原代码逻辑:将折扣档位从高到低排序并通过循环判断,避免了原代码中低档位覆盖高档位的错误,确保高金额能匹配到最高折扣。
- 灵活配置:所有需要自定义的参数都放在配置区,你可以轻松修改商品ID、优惠券码和折扣档位规则。
内容的提问来源于stack exchange,提问作者angga
相关产品推荐
相关产品推荐

