背景:
我想实现一个特殊的响应,流程如下:访问domain/test,响应一个表单页面,填写并提交表单页面后,wordpress进行响应(wordpress处理ajax请求)。
key point 1、怎么注册domain/test这个路由(add_rewrite_rule())?
key point 2、怎么响应domain/test这个请求(template_redirect)?
实现过程:
首先,wordpress 有重写url的方法,叫 add_rewrite_rule()。在function.php中加入如下代码段:
// 添加路由重写,每次修改完记得在wp-admin后台“设置”-》“固定链接”=》“保存”才能生效
add_action('init', 'theme_functionality_urls');
function theme_functionality_urls() {
add_rewrite_rule('^test','index.php?test=1','top');
}
这段代码的意思就是把domain?test=1改写成domain/test,top意思是把这个规则放到最前面。
此时,当你访问domain/test跟访问domain?test=1的效果是一样的。
但是,我们原本也没有对domain?test=1这样的请求进行响应。所以1、当请求domain?test=1的时候,我们怎么获取到这个test的值?2、怎么对这个请求进行响应?
add_action('query_vars', 'test_add_query_vars');
function test_add_query_vars($public_query_vars){
$public_query_vars[] = 'test';
return $public_query_vars;
}
这段代码的意思是在执行到query_vars这个钩子的时候,给$public_query_vars数组里面添加一个test字段,这个test字段就是当访问domain?test=1的时候的test的字段。当添加test到$public_query_vars之后,会检查每个请求url里是否包含test字段。
//模板载入规则
add_action("template_redirect", 'test_template_redirect');
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();
}
}
这段代码的意思是这样的,首先,这个TEMPLATEPATH是你的主题路径,连着/test/test.php相当于在你的主题目录下新建了一个test目录,test目录里有一个test.php文件。
所有的请求都会走这个方法,但是,唯独请求url中包含test字段并且test的值为1的时候会转至我们新建的/test/test.php页面。然后die()掉。
至此,当我们访问domain/test的时候,相当于在访问domain?test=1这个url,并且会把我们自定义的template展示出来。
我在这个test.php中写了一个表单,通过ajax请求打到wordpress后台进行处理,具体可以参考《wordpress处理ajax请求》。
参考:
http://www.ashuwp.com/courses/highgrade/318.html
https://www.iteblog.com/archives/1988.html