WooCommerce中基于已应用优惠券限制支付网关并显示提示消息的问题
WooCommerce中基于已应用优惠券限制支付网关并显示提示消息的问题
看起来你已经搞定了用优惠券限制支付网关的核心逻辑,不过在结账页面顶部的WooCommerce通知区显示提示消息这块卡壳了对吧?我来帮你完善代码,把通知显示的问题也解决掉。
首先,你的原代码思路是对的,但显示通知需要用到WooCommerce官方的通知函数和合适的钩子,这样消息才能正确出现在指定区域。下面是完整的改进代码:
// 基于已应用优惠券限制支付网关并添加提示通知 add_filter('woocommerce_available_payment_gateways', 'unset_gateway_by_applied_coupons'); add_action('woocommerce_before_checkout_form', 'display_coupon_payment_notice'); function unset_gateway_by_applied_coupons($available_gateways) { // 后台页面跳过,避免报错 if (is_admin()) { return $available_gateways; } // 设置要触发限制的优惠券代码 $target_coupons = array('test123', 'check123'); $applied_coupons = WC()->cart->get_applied_coupons(); // 检查是否有目标优惠券被使用 $has_target_coupon = !empty(array_intersect($target_coupons, $applied_coupons)); if ($has_target_coupon) { // 移除BACS支付网关(保留Stripe) if (isset($available_gateways['bacs'])) { unset($available_gateways['bacs']); } } return $available_gateways; } function display_coupon_payment_notice() { // 仅在前台结账页面执行 if (!is_checkout() || is_admin()) { return; } $target_coupons = array('test123', 'check123'); $applied_coupons = WC()->cart->get_applied_coupons(); if (!empty(array_intersect($target_coupons, $applied_coupons))) { // 添加提示消息到WooCommerce通知区域 wc_add_notice('您使用了专属优惠券,当前仅支持Stripe支付方式', 'notice'); } }
代码说明:
- 我把功能拆成了两个独立函数,逻辑更清晰:一个负责过滤支付网关,一个负责显示通知。
- 使用
array_intersect来检查优惠券是否被应用,比循环判断更简洁高效。 - 通知函数绑定到
woocommerce_before_checkout_form钩子,这个位置正好对应WooCommerce默认通知的显示区域。 - 用
wc_add_notice函数添加消息,这是WooCommerce官方推荐的方法,会自动适配默认的通知样式,确保消息正确显示。
注意事项:
- 确认你的Stripe支付网关ID是
stripe(如果你的网关ID不同,比如woocommerce_stripe,需要对应调整,但默认情况下是stripe)。 - 你可以根据需求修改通知文本,第二个参数
'notice'可以改成'success'(绿色成功样式)或'error'(红色错误样式)。 - 代码可以添加到主题的
functions.php文件,或者用自定义代码插件(比如Code Snippets)来添加,避免主题更新导致代码丢失。
备注:内容来源于stack exchange,提问作者SolaceBeforeDawn
相关产品推荐
相关产品推荐

