如何修改WooCommerce代码以允许用户移除折扣码并手动输入新优惠码
WooCommerce优惠券功能调整方案
本次调整完全保留原有订阅用户自动匹配对应等级优惠券的基础逻辑,同时支持用户手动移除自动优惠券、输入专属优惠码,修改点如下:
- 新增用户操作状态标记,用户手动删除自动优惠券或自行输入其他优惠码后,不会再被自动发放的优惠券覆盖
- 保留优惠券删除按钮的显示权限,用户可随时移除不需要的优惠
- 原有专属优惠码(如示例中的
50%off、voucher150)的优先级仍高于自动发放的优惠券
完整修改后代码
<?php // 监听用户移除优惠券操作,标记用户手动删除状态 add_action('woocommerce_removed_coupon', function($coupon_code) { $auto_coupon_list = [ 'basica-subscription-cupom', 'superior-subscription-cupom', 'clube-subscription-cupom' ]; if (in_array($coupon_code, $auto_coupon_list)) { WC()->session->set('user_disabled_auto_coupon', true); } }); // 监听用户手动应用优惠券操作,标记用户自定义优惠状态 add_action('woocommerce_applied_coupon', function($coupon_code) { $auto_coupon_list = [ 'basica-subscription-cupom', 'superior-subscription-cupom', 'clube-subscription-cupom' ]; if (!in_array($coupon_code, $auto_coupon_list)) { WC()->session->set('user_disabled_auto_coupon', true); } }); add_action('woocommerce_before_cart', function () { // 若用户已手动操作过优惠券,跳过自动发放逻辑 if (WC()->session->get('user_disabled_auto_coupon')) { return; } $basica_coupon_code = sanitize_text_field('basica-subscription-cupom'); $superior_coupon_code = sanitize_text_field('superior-subscription-cupom'); $clube_coupon_code = sanitize_text_field('clube-subscription-cupom'); // 各订阅等级对应产品ID $subscription_basica = array(3); $subscription_superior = array(41); $subscription_clube = array(1, 13); // 俱乐部和全量套餐 $allowed_coupons = array( '50%off', 'voucher150' ); $total_coupons = count(WC()->cart->get_applied_coupons()); // 已应用优惠券数量 // 检查用户是否持有对应等级订阅 $_userHasSubscription = function ($ids) { if (!empty(array_intersect(_getUserProducts(), $ids))) return true; return false; }; // 应用对应等级优惠券,不覆盖已存在的高优先级优惠 $_applyCouponToCart = function ($coupon_code) use ($allowed_coupons, $total_coupons) { foreach ($allowed_coupons as $allowed_coupon) { if (WC()->cart->has_discount($allowed_coupon)) // 已存在高优先级专属优惠则跳过 return true; } if (WC()->cart->has_discount($coupon_code) && $total_coupons <= 1) // 已匹配对应等级优惠则跳过 return true; WC()->cart->remove_coupons(); // 清除其他无效优惠 WC()->cart->apply_coupon($coupon_code); // 应用对应等级优惠 }; // 匹配基础版订阅优惠 if ($_userHasSubscription($subscription_basica)) $_applyCouponToCart($basica_coupon_code); // 匹配高级版订阅优惠 if ($_userHasSubscription($subscription_superior)) $_applyCouponToCart($superior_coupon_code); // 匹配俱乐部订阅优惠 if ($_userHasSubscription($subscription_clube)) $_applyCouponToCart($clube_coupon_code); add_action('wp_footer', function () { ?><script> jQuery(function($){ var func = function () { // 仅修改自动发放优惠券的显示名称,不影响用户手动添加的优惠 $('tr.coupon-basica-subscription-cupom th').text('基础版订阅专享10%优惠'); $('tr.coupon-superior-subscription-cupom th').text('高级版订阅专享15%优惠'); $('tr.coupon-clube-subscription-cupom th').text('俱乐部订阅专享20%优惠'); }; func(); window.setInterval(func, 12000);}); </script><?php }); });
逻辑说明
- 用户首次进入购物车时,仍会自动匹配对应订阅等级的优惠券
- 用户点击删除自动优惠券后,系统会记录该操作,后续刷新页面不会再自动添加对应优惠
- 用户自行输入并应用其他优惠码后,自动优惠逻辑也会停用,不会覆盖用户手动选择的优惠
- 如果需要重置自动优惠,用户清空购物车后重新进入即可恢复默认逻辑
内容的提问来源于stack exchange,提问作者Bruno Chaves
相关产品推荐
相关产品推荐

