WooCommerce 为指定优惠券PAYPALMSI设置支付网关例外的实现方法
解决方案
两段代码冲突的原因是它们都挂载了同一个woocommerce_available_payment_gateways过滤器,回调函数会按优先级先后修改可用支付方式列表,后执行的逻辑会覆盖前者的修改结果。你可以直接把两段逻辑合并到同一个过滤器函数中即可解决问题,合并后的完整代码如下:
add_filter('woocommerce_available_payment_gateways', 'applied_coupons_hide_payment_gateways', 20, 1 ); function applied_coupons_hide_payment_gateways( $available_gateways){ // 后台环境不执行逻辑 if( is_admin() ) return $available_gateways; $applied_coupons = WC()->cart->get_applied_coupons(); $has_paypalmsi = in_array('paypalmsi', $applied_coupons); // 存在特殊优惠券PAYPALMSI的情况 if ($has_paypalmsi) { // 移除stripe和bacs,仅保留PayPal可用 unset($available_gateways['stripe']); unset($available_gateways['bacs']); return $available_gateways; } // 存在其他优惠券的情况 if( sizeof( $applied_coupons ) > 0 ){ // 仅保留stripe和bacs,移除其他支付方式(含PayPal) foreach ( $available_gateways as $gateway_id => $gateway ) { if( $gateway_id != 'stripe' && $gateway_id != 'bacs' ) { unset($available_gateways[$gateway_id]); } } } return $available_gateways; }
逻辑说明
- 新增特殊优惠券优先级校验,先判断是否使用了
paypalmsi,命中后直接执行特殊规则返回结果,不走通用优惠券逻辑 - 把原代码中两层独立的if判断合并为
&&逻辑,减少代码冗余,执行效果和原逻辑完全一致 - 废弃原来的第二个过滤器函数,所有规则都在同一个钩子回调中处理,不会再出现逻辑覆盖的问题
内容的提问来源于stack exchange,提问作者Omar C
相关产品推荐
相关产品推荐

