以往我们需要创建一个特殊页面,我们都是新建一个 Page 单页,然后在主题目录里面新建一个 Page 模板,这样按照 WordPress 的调用顺序就可以自定义展示方式,但是如果是开发插件,这样方式就不行了,所以我们得自定义路由 URL 和 显示模板才行。
使用add_rewrite_rule
首先 WordPress 有重写 URL 的方法,叫 add_rewrite_rule($regex, $redirect, $after),在 function.php 中加入如下代码段:
function theme_functionality_urls() {
add_rewrite_rule('^test','index.php?test=1','top');
// 例如吧 网址?iteblog_hadoop 修改成 网址/wechat?iteblog_hadoop
// add_rewrite_rule('wechat$', 'index.php?iteblog_hadoop'', 'top');
}
add_action('init', 'theme_functionality_urls');
使用rewrite_rules_array
但是如果你需要自定义多条rewrite rules,add_rewrite_rule
函数就不行了,我们需要使用rewrite_rules_array
了,这属于Wordpress内置的hook,我们可以在里面添加很多条规则,使用如下:
function add_rewrite_rules($aRules) {
$aNewRules = array(
'^test$' => 'index.php?test=1';
// '^wechat$' => 'index.php?iteblog_hadoop';
);
$aRules = $aNewRules + $aRules;
return $aRules;
}
add_filter('rewrite_rules_array', 'add_rewrite_rules');
我们可以在 $aNewRules
是一个数组,所以可以在其中添加任意数量的规则。
添加路由重写,每次修改完记得在 wp-admin 后台 设置 -> 固定链接 -> 保存 才能生效。
然后还要声明自定义的查询参数,不然无法获取参数的内容
function test_add_query_vars($public_query_vars) {
$public_query_vars[] = 'test';
return $public_query_vars;
}
add_action('query_vars', 'test_add_query_vars');
所有非 WordPress 本身的查询参数,都需要使用上面的代码声明,不然 WordPress 会自动过滤掉。
最后是模板载入的规则,当检测到有我们自定义的参数的时候,就载入指定的模板
function test_template_redirect() {
global $wp;
global $wp_query;
$reditect_page = $wp_query->query_vars['test'];
if ($reditect_page == "1") {
include(TEMPLATEPATH.'/test/test.php');
die();
}
}
add_action("template_redirect", 'test_template_redirect');
这个 TEMPLATEPATH 是你的主题路径,连着 /test/test.php 相当于在你的主题目录下新建了一个 test 目录,test 目录里有一个 test.php 文件,当我们访问 网址/test 的时候,相当于在访问 网址?test=1 这个 URL,并且会把我们自定义的 template 展示出来。
PS:移除已有的规则
我们也可以利用这个钩子来移除已经存在的规则,使用如下:
function kill_feed_rewrites($rules) {
foreach ($rules as $rule => $rewrite) {
if ( preg_match('/^foo.*(feed)/',$rule) ) {
unset($rules[$rule]);
}
}
return $rules;
}
add_filter('rewrite_rules_array', 'kill_feed_rewrites');
声明:本站文章原创有部分资源来源于网络,如无特殊说明或标注。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系 admin@liitk.com 进行删除处理!。
评论(0)