問題描述

好的,所以我的問題很簡單。我需要為我的外掛實現一些自定義路由規則。那些路線只會有一個引數 (所以沒有什麼複雜的),看起來像: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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。