add_rewrite_rule 描述
add_rewrite_rule() 允許我們?yōu)?WordPress 添加自定義重寫規(guī)則,該函數(shù)通常和 add_rewrite_tag() (允許我們添加 WordPress 可以識別的自定義查詢參數(shù))配合使用。
add_rewrite_rule 使用
add_rewrite_rule($regex, $redirect, $after);
add_rewrite_rule 參數(shù)
$regex
(string) (必需) 一個匹配請求 URL 的正則表達(dá)式,可是使用一個或多個正則表達(dá)式組。
默認(rèn):None
$redirect
(string) (必需):真正需要獲取的 URL, ($regex 匹配時).。我們可以使用 $matches[] 數(shù)組在這里插入捕獲獲的匹配組。
默認(rèn): None
$after
(string) (可選):這可以是 ‘top’ 或 ‘bottom’.。’top’ 將在 WordPress 現(xiàn)有的規(guī)則之前優(yōu)先處理, ‘bottom’ 將在其他規(guī)則之后處理。
默認(rèn): “bottom”
add rewrite rule 使用示例
基本使用方法
首先,我們可以很方便的獲取某個頁面的 ID,使用正則表達(dá)式匹配頁面 ID,我們就可以自定義這個頁面的訪問 URL 了。
add_action('init', function ()
{
add_rewrite_rule('^leaf/([0-9]+)/?', 'index.php?page_id=$matches[1]', 'top');
});
現(xiàn)在,我們可以通過下面的自定義 URL 訪問同一個頁面了。
http://example.com/leaf/95
在自定義模板中使用查詢字符串
讓我們假設(shè)你正在創(chuàng)建一個用來展示營養(yǎng)信息的頁面 “Nutrition”。此頁面使用了一個自定義模板,并且有兩個參數(shù),食物和品種。在主題目錄中創(chuàng)建一個名為 my-custom-template.php 的文件,文件內(nèi)容如下:
<?php
/**
* Template Name: Nutritional Information
*/
get_header();
global $wp_query;
echo 'Food : ' . $wp_query->query_vars['food'];
echo '<br />';
echo 'Variety : ' . $wp_query->query_vars['variety'];
// ... more ...
get_footer();
?>
使用上面的模版創(chuàng)建一個頁面, 記下這個新頁面的 ID,然后使用 add_rewrite_tag() 讓 WordPress 可以識別自定義查詢變量 「food」 和 「variety」,示例代碼如下:
add_action('init', function ()
{
add_rewrite_tag('%food%', '([^&]+)');
add_rewrite_tag('%variety%', '([^&]+)');
}, 10, 0);
我們訪問以下頁面的時候, 這個頁面將通過查詢字符串傳遞過來兩個自定義參數(shù)。
http://example.com/index.php?page_id=12&food=milkshake&variety=strawberry
現(xiàn)在我們可以創(chuàng)建自定義規(guī)則來重寫上面的查詢字符串為靜態(tài)化的 URL 了,添加下面的代碼到主題或插件中,替換其中的 12 為我們上面創(chuàng)建的自定義頁面的 ID。創(chuàng)建完成后,不要忘了重新保存以下固定鏈接設(shè)置,以便讓新的自定義重寫規(guī)則生效。
add_action('init', function ()
{
add_rewrite_rule('^nutrition/([^/]*)/([^/]*)/?', 'index.php?page_id=12&food=$matches[1]&variety=$matches[2]', 'top');
}, 10, 0);
重新保存了固定鏈接設(shè)置后,我們就可以通過 URL http://example.com/nutrition/milkshakes/strawberry/ 來訪問我們重寫后的自定義頁面了。
從上面的代碼中可以看出來,添加自定義 URL 規(guī)則還是很麻煩的,如果我們需要添加比較多的自定義 URL,可以使用 WordPress Dispatcher 自定義路由庫來簡化這個工作。


