问题描述

好的,所以我的问题很简单。我需要为我的插件实现一些自定义路由规则。那些路线只会有一个参数 (所以没有什么复杂的),看起来像:http://www.example.org/myroute/myargument

理想情况下,这将调用自定义类,并显示一个自定义模板 (可以直接访问该类) 。

这是最好的方法?干杯

最佳解决方案

你需要做 3 件重要的事情。

  1. 创建自定义重写规则将 uri 的部分转换为传递给 index.php 的值

  2. 添加 myroutemyargument 作为查询 vars 到 WordPress 知道它们是有效的 $ _GET 参数当重写规则传递给他们

  3. 刷新重写规则。

首先,我建议,而不是 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 只是使它们 myroutemyargument 对 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。