WordPress中按来源页面隐藏WooCommerce支付网关问题求助
问题
我想为一款数字产品隐藏PayPal支付网关,但不是完全隐藏——只有当用户从指定页面(https://www.myshop.store/send-money/)进入结账页时才隐藏。我写了下面的代码,但没能成功隐藏该网关,求技术帮助:
//hide paypal if user access checkout from "send money" page add_filter( 'woocommerce_available_payment_gateways', 'dealion_payment_gateway_disable_onpage' ); function dealion_payment_gateway_disable_onpage( $available_gateways ) { $referer=wp_get_referer(); var_dump($referer); if ( isset( $available_gateways['paypal'] ) && $referer== "https://www.myshop.store/send-money/") { unset( $available_gateways['paypal'] ); } return $available_gateways; }
解决方案
问题根源
你的代码失效主要有这几个问题:
wp_get_referer()返回的URL可能和你写的地址存在末尾斜杠差异(比如实际返回https://www.myshop.store/send-money不带斜杠),用全等==判断会直接匹配失败- 保留
var_dump($referer)会在页面输出调试信息,破坏结账页的HTML结构,进而影响支付网关的正常渲染 - 没有限定逻辑仅在结账页执行,可能在其他WooCommerce页面触发不必要的判断
修复后的代码
// 仅当从指定页面进入结账页时隐藏PayPal网关 add_filter( 'woocommerce_available_payment_gateways', 'dealion_payment_gateway_disable_onpage' ); function dealion_payment_gateway_disable_onpage( $available_gateways ) { // 仅在结账主页面执行逻辑,排除订单完成等端点页面 if ( ! is_checkout() || is_wc_endpoint_url() ) { return $available_gateways; } $referer = wp_get_referer(); // 检查来源URL是否包含目标页面路径,兼容URL格式差异 if ( isset( $available_gateways['paypal'] ) && $referer && str_contains( $referer, '/send-money/' ) ) { unset( $available_gateways['paypal'] ); } return $available_gateways; }
核心优化说明
- 增加结账页校验:确保逻辑只在结账主页面生效,避免干扰其他WooCommerce页面
- 改用路径模糊匹配:用
str_contains检查来源URL是否包含/send-money/路径,不用严格匹配完整URL,兼容末尾斜杠、HTTP/HTTPS切换等情况 - 移除调试代码:删掉
var_dump避免破坏页面渲染 - 增加非空判断:先检查
$referer是否存在,防止出现未定义错误
内容的提问来源于stack exchange,提问作者George Obonyo
相关产品推荐
相关产品推荐

