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

WooCommerce单份免费商品折扣实现问题求助

WooCommerce 免费赠品类目规则实现(满N减1份)

问题原因

你原代码的核心错误是:set_price() 用于设置商品单价,但你把(购买数量-1)*单价这个总价当成单价赋值,导致购物车再用这个值乘以数量,最终计算结果完全错误。

正确解决方案

推荐使用WooCommerce官方提供的woocommerce_cart_calculate_fees钩子添加优惠,直接从购物车小计中扣除对应金额,这种方式不修改商品本身价格,逻辑更可靠。

代码实现

add_action('woocommerce_cart_calculate_fees', 'apply_free_gift_discount');
function apply_free_gift_discount($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    // 目标免费赠品商品ID列表
    $free_items_id = [344, 345, 346];
    $total_discount = 0;

    foreach ($cart->get_cart() as $cart_item) {
        $product_id = $cart_item['product_id'];
        $quantity = $cart_item['quantity'];
        $product_price = $cart_item['data']->get_price();

        // 判断是否为目标商品
        if (in_array($product_id, $free_items_id)) {
            // 数量>1时减免1份价格;数量=1时全额减免
            $discount_amount = $product_price;
            $total_discount += $discount_amount;
        }
    }

    // 添加优惠到购物车
    if ($total_discount > 0) {
        $cart->add_fee('免费赠品优惠', -$total_discount);
    }
}

代码说明

  1. 利用woocommerce_cart_calculate_fees钩子处理购物车费用调整,避开后台非AJAX操作的干扰
  2. 遍历购物车商品,对目标赠品类目商品:
    • 无论购买数量多少,都减免1份商品的价格(符合你“数量>1时减1份,数量=1时免费”的规则)
  3. 通过add_fee将优惠金额从购物车小计中扣除,优惠名称可根据需求修改

备选方案:修改商品单价(适合特定场景)

如果必须通过修改商品单价实现,需计算正确的单价(确保单价×数量 = 原总价-1份价格):

add_action('woocommerce_before_calculate_totals', 'adjust_free_gift_unit_price');
function adjust_free_gift_unit_price($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    $free_items_id = [344, 345, 346];

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product_id = $cart_item['product_id'];
        if (in_array($product_id, $free_items_id)) {
            $original_price = $cart_item['data']->get_price();
            $quantity = $cart_item['quantity'];

            if ($quantity > 1) {
                // 计算正确单价:(原总价 - 1份价格) / 数量
                $new_unit_price = ($original_price * $quantity - $original_price) / $quantity;
                $cart_item['data']->set_price($new_unit_price);
            } else {
                // 数量为1时免费
                $cart_item['data']->set_price(0);
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Shahadat Hossain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:52:45