問題描述
我花了幾天時間嘗試學習如何最好地新增重寫規則。到目前為止,我的理解是,新增簡單規則的合適方法是使用 add_rewrite_rules(),非常感謝 Jan Fabry 在這個交換中誰的闡述是非常有用的。
雖然他提到 add_rewrite_tags(),但我還沒有看到指南,它解釋了什麼時候有利於使用它,而不是新增重寫規則的其他方法,或者其使用的任何好的例子。它似乎是一個更強大的工具,但這是我所有的可能。我發現食典中的例子也是 cryptic 或 incomplete 。有人可以詳細闡述或指出一些資源嗎?我在 Google 上發現沒有用。
編輯:它的 Codex page 談論’generally’ 使用它與 add_rewrite_rules(),但沒有詳細說明。類似地,add_rewrite_rules()的 Codex page 是指 add_rewrite_tags(),但是對資訊也是非常稀疏的。何時以及如何使用這種組合?我發現的唯一的例子是 this answer by Rob Vermeer,我不明白。
最佳解決方案
根本區別是:
-
add_rewrite_rule()新增了一個解釋的特定規則 -
add_rewrite_tag()新增了一個在 URL 結構中使用的佔位符。然後,該佔位符用於生成多個規則。
例如 – 假設你是在各個國家廣告酒店的旅行社。你可能想要一個酒店的網址
www.example.com/hotels/UK/Balmoral
在這個國家 (在這個例子中是英國) 是一個自定義的分類術語,而巴爾莫勒是一個酒店 (郵政型別) 。我們可以為此新增重寫規則,但是我們必須生成一個規則:
-
酒店自己
-
酒店的附件
-
適用於多個頁面等的酒店 (帖子) 的規則
生成這些規則可能變得複雜。此外,我們可能會與 WordPress 自己的這個帖子型別的規則進行競爭 – 從我們在註冊帖子型別時設定的 permastructure 生成。 (無論如何,讓 WordPress 做的工作) 。
這個’permastructure’ – 類似於您在固定連結設定中設定的帖子 – 確定 WordPress 生成的重寫規則。但是,由於我們想要一個包含一些未知 (國家) 的結構 – 我們需要解釋 – 我們需要提供一個%country% 形式的佔位符。 (幾乎與%category% 相同) 。
例如:
add_action_init('init','wpse71305_register_types');
function wpse71305_register_types(){
//You'll need to register the country taxonomy here too.
//Add 'country' tag.
add_rewrite_tag('%country%', '([^&/]+)'));
//Register hotel post type with %country$ tag
$args = array(
...
'has_archive'=>true,
'rewrite' => array(
'slug'=>'hotels/%country%',
'with_front'=> false,
'feed'=> true,
'pages'=> true
)
...
);
register_post_type('hotel',$args);
}
注意:WordPress 不知道如何從%country% 標籤生成 url – 您需要告訴它。 (我在下面連結的文章中介紹) 。
最後 WordPress 還將儲存匹配的值,以便您可以透過 get_query_var()(不符合標準重寫規則的東西) 來檢索它。
您還可以建立要在帖子的永久性結構中使用的標籤 (在固定連結設定頁面中設定) 。
透過新增標籤,我們可以在 permastructures 中使用它。 WordPress 然後知道
-
期待什麼
-
如何解釋 url(檢查它匹配)
-
如何解釋該值 (即’UK’)
(作為參考看到這篇文章我寫道:http://wp.tutsplus.com/tutorials/creative-coding/the-rewrite-api-the-basics/) 。
Edit
如上所述,上面的例子是比較差的,因為 register_taxonomy()其實是呼叫 add_rewrite_tag()。
關於使用它們的食典檔案’in combination’:這可能是誤導的,因為它們都可以獨立使用。但是,如上所述,add_rewrite_tag()將標籤名稱新增到 WordPress-understand ‘query variables’ 。實際上,您可以使用 get_query_var()檢索該值。因此,當 add_rewrite_rule()與 add_rewrite_tag()一起使用時,該變數將由 WordPress 儲存。但是還有其他的方法可以做到這一點 (參見 this answer – 還有 Rob Vermeer 的評論) 。
也相關:How to retrieve $_GET variables from rewritten URLs?
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。