WooCommerce仅对第2件商品设置全局折扣的技术求助
实现WooCommerce仅第2件商品享20%全局折扣的方案
我来帮你完善这个需求的实现代码——你原来用的woocommerce_product_get_price钩子其实不太适合这个场景,因为它是修改商品的基础价格,没法区分购物车里的购买数量,会导致所有商品都被改价,不符合「仅第2件」的要求。咱们换个更精准的方式来实现,同时支持简单商品和可变商品:
核心思路
通过woocommerce_cart_calculate_fees钩子在购物车结算阶段添加针对性折扣,这样既不会影响商品页面的原价显示,又能精准判断每个商品的购买数量,只给第2件商品减去20%的费用(不管买多少件,仅减一次该折扣)。
完整代码
// 先移除原来不适合当前需求的钩子 remove_filter('woocommerce_product_get_price', 'fifty_percent_on_second_product', 90, 2 ); remove_filter('woocommerce_product_get_regular_price', 'fifty_percent_on_second_product', 90, 2 ); // 添加购物车折扣计算的钩子 add_action('woocommerce_cart_calculate_fees', 'apply_second_item_20_percent_discount', 20, 1); function apply_second_item_20_percent_discount( $cart ) { // 仅对登录用户生效,同时避免后台操作时误触发 if ( ! is_user_logged_in() || (is_admin() && ! defined('DOING_AJAX')) ) { return; } // 先移除已存在的同款折扣,防止重复计算 foreach ( $cart->get_fees() as $key => $fee ) { if ( $fee->name === __('第2件商品20%折扣', 'woocommerce') ) { $cart->remove_fee($key); } } $total_discount = 0; // 遍历购物车中的每个商品项 foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; $purchase_quantity = $cart_item['quantity']; // 只有购买数量≥2时,才计算该商品的第2件折扣 if ( $purchase_quantity >= 2 ) { // 获取商品原价(自动适配简单/可变商品) $regular_price = (float) $product->get_regular_price(); // 计算折扣金额:仅第2件享20%折扣,即减免原价的20% $item_discount = $regular_price * 0.2; $total_discount += $item_discount; } } // 如果有折扣金额,添加到购物车 if ( $total_discount > 0 ) { $cart->add_fee( __('第2件商品20%折扣', 'woocommerce'), -$total_discount ); } }
代码说明
- 钩子替换:放弃直接修改商品价格的钩子,改用购物车结算阶段的费用钩子,更贴合「按购买数量计算折扣」的需求。
- 登录限制:保留了你原代码中的
is_user_logged_in()判断,仅登录用户能享受该折扣。 - 重复计算防护:先移除已存在的同款折扣,避免购物车更新时重复添加折扣费用。
- 多商品适配:遍历购物车所有商品,每个商品只要购买数量≥2,就计算一次第2件的折扣(比如同时买2件夹克+3件T恤,夹克和T恤各享一次第2件折扣)。
- 可变商品支持:通过
$product->get_regular_price()自动获取可变商品选中变体的原价,无需额外区分商品类型。
测试场景验证
- 购买1件夹克:无折扣,总价为原价。
- 购买2件夹克:总价 = 原价×2 - 原价×0.2(仅第2件享20%折扣)。
- 购买5件夹克:总价 = 原价×5 - 原价×0.2(仍仅第2件享折扣)。
- 购买1件夹克+2件T恤:夹克无折扣,T恤享第2件20%折扣,总折扣为T恤原价×0.2。
内容的提问来源于stack exchange,提问作者user10913018
相关产品推荐
相关产品推荐

