WooCommerce特定优惠券互斥设置:仅禁止A与B同时使用
WooCommerce 特定优惠券组合互斥限制实现方案
要实现仅让优惠券A和B互斥、其余优惠券仍可叠加2张的需求,直接通过WooCommerce的钩子写自定义代码就能搞定,不需要依赖额外插件。核心思路是在优惠券应用/验证阶段,检查购物车中是否存在冲突的目标优惠券,若存在则阻止当前优惠券生效或移除已存在的冲突优惠券。
具体代码实现
将以下代码添加到你的主题functions.php文件,或自定义插件的PHP文件中:
// 定义互斥的优惠券组合(替换成你的优惠券slug或ID) function get_mutually_exclusive_coupons() { return array( 'coupon-a' => array('coupon-b'), // 优惠券A不能和优惠券B共存 'coupon-b' => array('coupon-a') // 优惠券B不能和优惠券A共存 ); } // 当优惠券被应用时,检查并移除冲突的优惠券 add_action('woocommerce_applied_coupon', 'check_and_remove_conflicting_coupons'); function check_and_remove_conflicting_coupons($applied_coupon) { $mutual_coupons = get_mutually_exclusive_coupons(); // 如果当前应用的优惠券在互斥列表中 if (isset($mutual_coupons[$applied_coupon])) { $cart = WC()->cart; $conflicting_coupons = $mutual_coupons[$applied_coupon]; // 遍历购物车已应用的优惠券,移除冲突的 foreach ($cart->get_applied_coupons() as $coupon) { if (in_array($coupon, $conflicting_coupons)) { $cart->remove_coupon($coupon); wc_add_notice(sprintf('优惠券 %s 与已应用的优惠券 %s 无法同时使用', wc_get_coupon_code_by_id($applied_coupon), wc_get_coupon_code_by_id($coupon)), 'error'); } } } } // 在优惠券验证阶段,阻止冲突优惠券被应用 add_filter('woocommerce_coupon_is_valid', 'prevent_conflicting_coupon_application', 10, 3); function prevent_conflicting_coupon_application($is_valid, $coupon, $discount) { $mutual_coupons = get_mutually_exclusive_coupons(); $coupon_code = $coupon->get_code(); // 如果当前验证的优惠券在互斥列表中 if (isset($mutual_coupons[$coupon_code])) { $cart = WC()->cart; $conflicting_coupons = $mutual_coupons[$coupon_code]; // 检查购物车是否已有冲突优惠券 foreach ($cart->get_applied_coupons() as $applied_coupon) { if (in_array($applied_coupon, $conflicting_coupons)) { $is_valid = false; wc_add_notice(sprintf('优惠券 %s 与已应用的优惠券 %s 无法同时使用', $coupon_code, $applied_coupon), 'error'); break; } } } return $is_valid; }
配置说明
- 替换优惠券标识:在
get_mutually_exclusive_coupons函数中,把coupon-a和coupon-b替换成你实际的优惠券slug(或ID),如果需要添加更多互斥组合,直接按现有格式扩展数组即可。 - 后台设置:确保WooCommerce后台的「优惠券」设置中,开启了「允许使用多个优惠券」选项,并且不要将优惠券A或B设置为「不可与其他优惠券叠加」——我们的自定义代码会单独处理这对组合的互斥逻辑。
- 错误提示:代码中已经包含友好的错误提示,用户尝试叠加冲突优惠券时会收到明确的提示信息。
这样设置后,除了A和B不能同时使用外,其他任意两张优惠券都可以正常叠加生效。
内容的提问来源于stack exchange,提问作者pelle by shelly gafni
相关产品推荐
相关产品推荐

