You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 );
    }
}

代码说明

  1. 钩子替换:放弃直接修改商品价格的钩子,改用购物车结算阶段的费用钩子,更贴合「按购买数量计算折扣」的需求。
  2. 登录限制:保留了你原代码中的is_user_logged_in()判断,仅登录用户能享受该折扣。
  3. 重复计算防护:先移除已存在的同款折扣,避免购物车更新时重复添加折扣费用。
  4. 多商品适配:遍历购物车所有商品,每个商品只要购买数量≥2,就计算一次第2件的折扣(比如同时买2件夹克+3件T恤,夹克和T恤各享一次第2件折扣)。
  5. 可变商品支持:通过$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:03:28