如何客製 WordPress 固定網址?認識Rewrite API


作者: | 2012/10/09 16:44:24 | 留言


wordpress rewrite api

美化網址

一般動態網站經常利用GET參數附加在網址後方,來作為查詢資料的條件,WordPress網站也不例外,假設要觀看本站post id為1991的文章,就可以開啟 http://www.mrmu.com.tw/?p=1991,此時WordPress就會知道你要取出post id為1991的文章,接著把資料拿出來顯示。

可是有人覺得這種給程式看的網址太醜了,所以就利用撰寫Rewrite Rule的方式,來「美化」網址。像是上例id為1991的文章網址,就被美化成為 http://www.mrmu.com.tw/2012/06/29/seo-for-startups-in-under-10-mins/ 了,但這個網址其實是假的,實際上還是會透過 Rewrite Rule轉譯成 http://www.mrmu.com.tw/?p=1991,再丟給WP作處理。

本文介紹的Rewrite API就是這種網址美化的工具,這種欺騙大眾的工具也有傳說對SEO是有幫助的。如果進入WordPress的後台可以在「設定」內找到「固定網址」,來設定網址Rewrite的形式,這裡可以讓我們輕鬆的美化預設文章型別的網址。

是的預設的內容都有了美化的網址,但如果今天要處理的是新加入的自訂GET參數呢?

Rewrite API實例說明

假設我們拿了某個頁面(舊稱網誌分頁,id假設為8)來撰寫新功能,並且希望能使用一個自訂的GET參數叫myname(假設它的值是’audilu’),那麼此例的真實網址就會是:
http://www.example.com/index.php?page_id=8&myname=audilu

假設我們理想中美化過的網址是:
http://www.example.com/haha/audilu/

接著就是Rewrite API上場的時候了! 我們可以利用add_rewrite_rule()這個函數來建立新的Rewrite Rule:

add_action( 'init', 'my_rr_url' );
function my_rr_url()
{		
	//Ensure the $wp_rewrite global is loaded
	global $wp_rewrite;	
	add_rewrite_tag('%myname%','([^&]+)');
	add_rewrite_rule( 'haha/([A-Za-z0-9]{1,})/?$','index.php?page_id=8&myname=$matches[1]', 'top' );
	//Call flush_rules() as a method of the $wp_rewrite object
	$wp_rewrite->flush_rules();
}

稍微解說一下,rewrite api的使用時機,通常要在init或更早之前。接著第一行宣告的 $wp_rewrite,是為了最後要做flush_rules(),這是因為rewrite rules有快取機制,要清一下才能看到最新的情況,等到功能完成時其實可以將flush的code註解掉。

然後是 add_rewrite_tag()的部份,在我們要使用自訂的GET參數myname之前,必須先向WP「註冊」一下,讓WP知道這是個合法的參數,所以要利用add_rewrite_tag()來加入myname。

接著是 add_rewrite_rul(),第一個參數是網址套用的規則,要放進Regular Expression格式的條件,上例指的是「haha/的後面可放一個以上的英數字」。

第二個參數是要套用的原始網址,要注意這個部份一定要放進「真實的網址」,不能是美化後的形式,上例中的$matches就是開放讓你丟值的陣列,從$matches[1]開始,如果有第二個參數則是$match[2],以此類推。

第三個參數若是top,表示優先進行此規則的配對,若為bottom則會先參考其他的rewrite rule。

至此大致完成了,接著就是要在page頁裡取得myname這個自訂GET參數內的值了,請記住,它不是一般的GET參數,因此不能用$_GET來取值,必須利用$wp_query來取值:

global $wp_query;
echo $wp_query->query_vars['myname'];

Rewrite Rules出問題了! 該如何除錯?

Rewrite Rules的設定其實很容易出事,而且在不使用Rewrite API,只利用後台的「固定網址」進行設定的情況下,就常看到有災情傳出。
如果你仿照上例來改,但卻有問題,請:

  1. 檢查該篇分頁是否真的存在。
  2. 檢查你的GET參數是否使用了保留字,可以用 print_r($wp_query->query_vars); 來觀察query_vars是否有碰撞了。

如果真的還是有問題,除了print_r($wp_rewrite); 這種暴力法之外,還有個非常方便的外掛可以利用:Monkeyman Rewrite Analyzer

它會列出WP網站裡的所有Rewrite Rules,並且可以輸入測試網址,來觀察會套用到哪一個Rule,真是Rewrite API除錯的利器。

參考:
http://codex.wordpress.org/Rewrite_API


標籤:,

分類:,

本文作者是Audi Lu

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

*

*

*

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料