WordPress自定义重写规则导致常规文章无法访问问题求助
问题分析与修复方案
你的问题出在template_include过滤器的回调函数上——你没有接收过滤器传递的默认模板参数,也没有在不匹配自定义规则时返回原模板。当访问常规文章时,get_query_var('ztest')为假,此时$template变量未定义,WordPress找不到要加载的模板,就会显示空白页面。
修复后的完整插件代码
<?php /** * Plugin Name: URL Rewrite Test */ add_action('init', 'z_add_rewrite_rules'); function z_add_rewrite_rules(){ add_rewrite_rule('^ztest/([a-z0-9-]+)[/]?$','index.php?ztest=$matches[1]','top'); } add_filter('query_vars','z_set_query_vars'); function z_set_query_vars($query_vars){ // 接收原查询变量集合,避免覆盖其他自定义变量 $query_vars[] = 'ztest'; return $query_vars; } add_filter('template_include','z_include_template'); function z_include_template($template){ // 接收WordPress传递的默认模板路径 if(get_query_var('ztest')){ // 自定义模板路径 $new_template = plugin_dir_path(__FILE__).'/template.php'; if(file_exists($new_template)){ $template = $new_template; } } // 无论是否匹配自定义规则,都返回有效模板路径 return $template; } ?>
关键修改点说明
- 为
z_include_template添加参数$template:这个参数是WordPress自动传递的默认模板路径(比如文章对应的single.php、页面对应的page.php),确保不触发自定义规则时,能正常返回常规内容的模板。 - 优化
z_set_query_vars函数:添加原$query_vars参数作为输入,避免覆盖其他插件或主题添加的自定义查询变量,这是更规范的写法。 - 确保始终返回有效模板:无论是否匹配自定义规则,函数最后都会返回
$template,不会出现变量未定义导致的空白问题。
最后一步:刷新重写规则
虽然你已经设置了固定链接为“文章名称”,建议再次进入WordPress后台的设置→固定链接页面,直接点击“保存更改”按钮,确保新的重写规则被正确写入.htaccess文件(或WordPress的重写规则缓存)。
修改完成后,访问常规文章(比如localhost:81/wordpress572/hello-world/)就能正常加载默认模板,访问自定义规则的URL(localhost:81/wordpress572/ztest/asdf/)也能正确加载你的template.php了。
内容的提问来源于stack exchange,提问作者ZedBee
相关产品推荐
相关产品推荐

