本來這篇教程應該提前的,但是由於在教程十七寫了個自定義註冊頁面的例子,那乾脆把自定義登陸、自定義找回密碼的例項都寫出來,以便靈活掌握 WordPress 重寫規則的運用。
但是我們發現,前面的例子都是翻譯一個地址,而沒有輸出地址,比如我們前面的教程講到了自定義文章型別,在 WordPress 建立了自定義文章型別後 (比如一個 book 型別的文章),那麼這類文章的 url 地址將會是:「ashuwp.com/book/文章名」 而在 WordPress 後臺固定連線中也沒有對於自定義文章型別的固定連線設定。看了前面的教程,我們可以將 ashuwp.com/book/123.html 這類地址正確翻譯到 ID 為 123 的 book 型別文章,但是我們在模板中使用 the_permalink() 函式輸出的連結型別還是 「ashuwp.com/book/文章名」 這種型別。這也就是我說的,只有翻譯、沒有輸出。
研究過 WordPress 固定連結的人可能經常看到函式 add_rewrite_tag(),這個函式 就是我們這篇教程要說的重點:重寫標籤。
在本站進階教程二:WordPress 進階教程 (二): 註冊一個自定義的文章型別中,註冊了一個自定義文章型別-book: 請參考前面的教程

假設我們上圖中的文章 《測試文章》 ID 為 123,那麼我們要透過 ashuwp.com/book/123.html 的連結格式來訪問這篇文章怎麼呢?
如果熟悉了前面的教程,那麼很簡單:
- add_action('generate_rewrite_rules', 'ashu_rewrite_rules' );
- function ashu_rewrite_rules( $wp_rewrite ){
- $new_rules = array(
- 'book/([0-9]+)?.html$' => 'index.php?post_type=book&p=$matches[1]',
- 'top'
- );
- $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
- }
上面的重寫規則中正規表示式:[0-9] 即匹配數字,在主題的 functions.php 中新增上面的程式碼即可,然後訪問地址 ashuwp.com/book/123.html 就會發現,居然到了正確的頁面 (如果錯誤、請更新重寫規則,你懂的,沒懂就參考前面的教程)
然而我們從透過模板輸出的連結,或者透過後臺點選檢視文章,發現連結還是:「ashuwp.com/book/測試文章」, 在主題中新增下面的程式碼:
- add_filter('post_type_link', 'ashu_book_link', 1, 3); //過濾器 post_type_link 即輸出連結的時候用
- function ashu_book_link( $link, $post = 0 ){
- if ( $post->post_type == 'book' ){ //判斷如果是 book 型別的文章
- return 'http://www.ashuwp.com/book/'.$post->ID .'html'; //返回一個正確的連結
- } else {
- return $link;
- }
- }
即可輸出正確的連結,然而教程到了這裡,還沒進入正題--重寫標籤。上面兩個程式碼知識為了熟悉一下重寫規則的使用。
重寫標籤在 WordPress 後臺-設定-固定連線裡面用到的 %post_id% %post_name% 之類的就是重寫標籤了,我們前面也說過,WordPress 後臺設定的 「固定連結格式」 是會儲存到資料庫中的_options 表中,重寫標籤的主要作用也就是用來建立一個 「固定連結格式」
上面新增的段程式碼,完全可以用下面的一段程式碼來代替:
- add_action('init', 'ashu_book_rewrite');
- function ashu_book_rewrite() {
- global $wp_rewrite;
- $queryarg = 'post_type=book&p=';
- $wp_rewrite->add_rewrite_tag('%book_id%', '([^/]+)', $queryarg);
- //這裡的%book_id% 就是重寫標籤,第二個引數為匹配這個標籤的正規表示式,第三個引數這個標籤匹配的翻譯規則
- $wp_rewrite->add_permastruct('book', '/book/%book_id%.html', false);
- //add_permastruct 是往資料庫中儲存一個固定連結格式,第一個引數為名稱
- }
- add_filter('post_type_link', 'ashu_book_permalink', 1, 3);
- function ashu_book_permalink($post_link, $post = 0) {
- global $wp_rewrite;
- if ( $post->post_type == 'book' ){ //判斷文章型別
- if ( is_wp_error( $post ) )
- return $post;
- $newlink = $wp_rewrite->get_extra_permastruct('book'); //獲取前面儲存的名為 book 的固定連結格式
- $newlink = str_replace("%post_id%", $post->ID, $newlink); //將格式裡面的重寫標籤替換為文章 ID
- $newlink = home_url(user_trailingslashit($newlink)); //完整的連結地址
- return $newlink; //返回
- } else {
- return $post_link;
- }
- }
上面的程式碼中,輸出連線就不用解釋了。翻譯:當訪客訪問地址 「www.ashuwp.com/book/123.html」,這個地址剛好匹配了名為 「book」 的固定連線格式,而這個格式裡面的標籤 「%book_id%」 是要翻譯成 「post_type=book&p=」 的,所以翻譯為 「www.ashuwp.com/?post_type=book&p=123」 這樣就能正確翻譯了。。。所以上面的 add_rewrite_tag 和 add_permastruct 兩個函式組合的效果和使用函式新增重寫的規則
- 'book/([0-9]+)?.html$' => 'index.php?post_type=book&p=$matches[1]',
是一樣的。