您需要做三件重要的事情:
创建自定义重写规则,将URI的一部分转换为传递给的值index.php
.添加myroute
和myargument
到WordPress的查询变量白名单,这样WordPress就不会在查询字符串中出现时忽略它们刷新重写规则首先,我建议http://www.example.org/myroute/myargument
, 您决定使用某种特殊的前缀或后缀来表示何时应该将URI视为这些特殊“路由”之一。为了这个例子,我选择了前缀api
, 这样就可以http://www.example.org/api/myroute/myargument
. 我选择了api
因为当我做了一些RESTful的事情时,就像你正在做的一样,它是针对API的。
The Code
add_filter( \'rewrite_rules_array\', \'my_insert_rewrite_rules\' );
add_filter( \'query_vars\', \'my_insert_query_vars\' );
add_action( \'wp_loaded\', \'my_flush_rules\' );
// flush_rules() if our rules are not yet included
function my_flush_rules() {
$rules = get_option( \'rewrite_rules\' );
if ( ! isset( $rules[\'api/(.*?)/(.+?)\'] ) ) {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
}
// Adding a new rule
function my_insert_rewrite_rules( $rules ) {
$newrules = array();
$newrules[\'api/(.*?)/(.+?)\'] = \'index.php?myroute=$matches[1]&myargument=$matches[2]\';
return $newrules + $rules;
}
// Adding the id var so that WP recognizes it
function my_insert_query_vars( $vars ) {
array_push( $vars, \'myroute\', \'myargument\' );
return $vars;
}
Quick Breakdown
一切都很简单。正则表达式模式被添加到WordPress中所有重写规则的列表中,您的自定义模式位于列表的顶部。当模式匹配时,WordPress将停止查看重写规则列表,并使用正则表达式捕获的值代替引用(
$matches[1]
和
$matches[2]
) 在传递给的查询字符串中
index.php
.
添加查询变量myroute
和myargument
进入白名单只会让WordPress关注它们,而不是丢弃它们。
Alternative way of \'namespacing\' your custom route
如果您想避免使用
/api/
可以使用查询字符串变量/字段作为前缀。要这样做,您可以将正则表达式更改为
(.*?)/(.+?)\\\\?api=1
然后添加
api
作为
array_push()
在中拨打的电话
my_insert_query_vars()
.
这将更改自定义路由,以便它随时触发api=1
是查询字符串的第一个元素,例如,它将触发http://example.com/anytext/anytext?api=1
.
忽略“名称空间”一词的使用——只是为了简洁起见。
如果您不使用前缀或后缀“namespace”,那么最终会出现URI模式冲突。这是因为WordPress无法将您的自定义模式与打算作为帖子或页面的模式区分开来。WordPress怎么会知道myroute
不是分类法、术语或父页?
希望这有帮助。