You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:57:20