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); } }
代码说明
- 利用
woocommerce_cart_calculate_fees钩子处理购物车费用调整,避开后台非AJAX操作的干扰 - 遍历购物车商品,对目标赠品类目商品:
- 无论购买数量多少,都减免1份商品的价格(符合你“数量>1时减1份,数量=1时免费”的规则)
- 通过
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
相关产品推荐
相关产品推荐

