WordPress如何实现404场景按URL含/product规则自定义跳转
WordPress 404场景自定义跳转实现方案
这个需求可以正常实现,你提供的参考代码存在逻辑倒置、WordPress规范不兼容、匹配规则漏洞等问题,修正后即可生效。
原代码存在的问题
- 逻辑判断写反:原代码识别到URL包含
/product/时将$redirect设为true,但后续逻辑是$redirect == false才触发跳转,实际会把产品路径的请求拦截跳转,和需求完全相反 - 未声明全局变量:直接调用
$wp对象没有提前全局声明,会导致无法正确获取当前请求路径 - 跳转方式不规范:使用原生
header()函数跳转容易触发「headers already sent」报错,也无法兼容HTTPS、站点安装在子目录等场景 - 路径匹配有漏洞:仅匹配带尾斜杠的
/product/,会漏过/product、/product?id=xxx这类合法产品路径 - 404地址写法错误:
home_url(404)传入数字参数会被WordPress识别为页面ID,ID为404的页面不一定是你设置的自定义404落地页
修正后可直接使用的代码
将以下代码添加到当前主题的functions.php文件,或者通过代码片段插件插入即可生效:
add_action('template_redirect', function() { // 仅在触发404状态时执行逻辑 if (!is_404()) { return; } global $wp; $current_path = $wp->request; // 匹配product路径前缀,兼容带/不带尾斜杠、带查询参数的场景 // PHP版本 >= 8.0 用下面这行 if (str_starts_with($current_path, 'product')) { // 命中产品路径,正常放行不跳转 return; } // 如果你的PHP版本低于8.0,把上面的str_starts_with判断替换成下面这段 // if (strpos($current_path, 'product') === 0) { // return; // } // 非产品路径的404请求,301永久跳转到站点自定义404页 wp_redirect(home_url('/404'), 301); exit; });
注意:如果你的站点自定义产品路径不是
product前缀,只需要把判断逻辑里的product替换成你实际用的路径关键词即可。如果是WooCommerce默认产品页,自带/product/前缀,代码可以直接兼容。
内容的提问来源于stack exchange,提问作者Arijit Banerjee
相关产品推荐
相关产品推荐

