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