如何让WooCommerce优惠券将配送费计入抵扣范围?
解决WooCommerce优惠券抵扣运费的方案
嘿,太懂你用优惠券当礼品卡的临时操作了——毕竟找不到替代方案时,这确实是个能凑合用的权宜之计!针对你说的优惠券不抵扣运费的问题,刚好有个简单的钩子函数能搞定,不用折腾复杂插件,加段代码就行。
核心逻辑
WooCommerce默认的优惠券规则是只抵扣商品金额,运费不在抵扣范围内。我们可以通过woocommerce_coupon_get_discount_amount这个过滤器钩子,修改优惠券的计算逻辑,把运费也纳入抵扣范畴。
实现代码
把下面的代码添加到你的主题functions.php文件里(更推荐用子主题或者自定义插件存放,避免主题更新丢失代码):
add_filter('woocommerce_coupon_get_discount_amount', 'include_shipping_in_coupon_discount', 10, 5); function include_shipping_in_coupon_discount($discount_amount, $discounting_amount, $cart_item, $single, $coupon) { // 只针对用作礼品卡的优惠券(可根据实际需求调整判断条件) // 如果你想让所有优惠券都生效,直接删掉下面的if判断即可 $target_coupons = ['GIFT_CARD_300', 'GIFT_CARD_500']; // 替换成你的礼品卡优惠券代码 if (!in_array($coupon->get_code(), $target_coupons)) { return $discount_amount; } // 获取当前购物车的运费总额 $shipping_total = WC()->cart->get_shipping_total(); // 计算优惠券剩余可抵扣额度 $remaining_coupon_amount = $coupon->get_amount() - $discounting_amount; // 若剩余额度足够覆盖运费,就把运费全额加入抵扣;否则只抵扣剩余额度 if ($remaining_coupon_amount >= $shipping_total) { $discount_amount += $shipping_total; } else { $discount_amount += $remaining_coupon_amount; } return $discount_amount; }
代码说明
- 把
$target_coupons里的示例代码替换成你实际用作礼品卡的优惠券代码,多个的话直接往数组里加就行。 - 代码会先判断当前使用的是不是你指定的礼品卡优惠券,然后计算运费总额和优惠券剩余额度,自动调整抵扣金额——这样用户下单时,优惠券会先扣商品钱,再扣运费,剩下的额度还能留着下次用。
注意事项
- 务必先测试:正式上线前,多测几种场景——比如优惠券额度刚好等于商品+运费、额度不够覆盖总金额、只买低价商品加运费等情况,确保逻辑没问题。
- 备份代码:如果是加在主题
functions.php,记得备份一份,主题更新后这段代码可能会被覆盖,用子主题或者自定义插件更稳妥。 - 兼容其他插件:如果你的网站还有其他优惠券相关插件,可能需要调整代码的优先级(代码里的
10就是优先级,数字越大执行越晚),避免规则冲突。
内容的提问来源于stack exchange,提问作者eMikkelsen
相关产品推荐
相关产品推荐

