WordPress自定义模板伪静态规则生效却返回404问题求助
解决WordPress自定义URL伪静态后404的问题
你的问题出在直接用.htaccess将请求指向package.php,绕过了WordPress的核心查询机制。WordPress所有页面请求都需要通过index.php处理,直接访问模板文件会导致WP无法识别页面上下文,返回404。以下是正确的解决流程:
1. 用WordPress重写API添加自定义规则
在子主题的functions.php文件中添加以下代码:
// 注册自定义查询变量,让WordPress识别该参数 function register_package_query_var($vars) { $vars[] = 'package_id'; return $vars; } add_filter('query_vars', 'register_package_query_var'); // 添加重写规则,匹配美化后的URL并映射到对应页面 function add_package_rewrite_rule() { add_rewrite_rule( '^forfait/(\d+)/?$', 'index.php?pagename=forfait&package_id=$matches[1]', 'top' ); } add_action('init', 'add_package_rewrite_rule');
添加代码后,进入WordPress后台的设置 → 固定链接,直接点击「保存更改」(无需修改现有设置),触发WP刷新重写规则,使新规则生效。
2. 调整.htaccess规则
保留原有的外部重定向规则(将带参数的旧URL跳转到美化后的URL),删除内部重写的规则。最终你添加到.htaccess的部分应该是:
RewriteEngine ON RewriteCond %{THE_REQUEST} \s/([^?]*)\?package-id=(\S+)\s [NC] RewriteRule ^ /%1/%2? [R=301,L]
WordPress自带的默认规则保持不变,不要改动。
3. 在模板中获取参数
在package.php模板文件中,使用WordPress的官方函数获取参数,替代直接读取$_GET:
$package_id = get_query_var('package_id'); // 后续可使用$package_id查询对应套餐数据
为什么原来的方法失效?
WordPress的请求处理流程是所有请求先经过index.php,由WP解析URL并匹配对应的页面、模板。你之前的规则直接将请求转到package.php,跳过了WP的查询环节,WP无法识别这是forfait页面的请求,因此返回404错误。
内容的提问来源于stack exchange,提问作者Real
相关产品推荐
相关产品推荐

