问题描述
好的,所以我的问题很简单。我需要为我的插件实现一些自定义路由规则。那些路线只会有一个参数 (所以没有什么复杂的),看起来像:http://www.example.org/myroute/myargument
理想情况下,这将调用自定义类,并显示一个自定义模板 (可以直接访问该类) 。
这是最好的方法?干杯
最佳解决方案
你需要做 3 件重要的事情。
-
创建自定义重写规则将 uri 的部分转换为传递给 index.php 的值
-
添加
myroute
和myargument
作为查询 vars 到 WordPress 知道它们是有效的 $ _GET 参数当重写规则传递给他们 -
刷新重写规则。
首先,我建议,而不是 http://www.example.org/myroute/myargument
,你可以使用某种特殊的前缀或后缀来表示当 uri 应该被认为是这些特殊的’routes’ 之一。为了这个例子,我选择了前缀 api
,这样它就是 http://www.example.org/api/myroute/myargument
。我选择了 api,因为当我做了一些像你似乎在做的一样安静的事情,这是一个 API 。
代码
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;
}
快速分解
它的所有相当直接的方式,正则表达式模式被添加到 WordPress 中的所有重写规则的列表中,您的自定义模式位于列表中。当与模式匹配时,WordPress 将停止查找,并将捕获的值传递给 index.php 字符串中的后引用。
添加查询 vars 只是使它们 myroute
和 myargument
对 index.php 有效。
‘namespacing’ 的替代方式您的自定义路由
如果您想避免使用/api/
作为前缀,可以使用查询字符串 var 。要做这样的事情,您可以将正则表达式更改为 (.*?)/(.+?)\?api=1
,然后将 api
作为附加参数添加到 my_insert_query_vars()
中的 array_push
函数。
这样会改变自定义路由,以便在任何时候都有 http://example.com/anytext/anytext?json=1
被触发。
忽略使用术语’namespacing’ – 只是简单地使用它。
如果您没有使用前缀或后缀的’namespace’,则最终会出现冲突的 uri 模式。这是因为 WordPress 将无法区分您的自定义模式与一个打算成为帖子或页面。 WordPress 如何知道’myroute’ 是不是分类,还是术语?还是父页面?
希望这可以帮助。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。