WordPress功能函數(shù)add_rewrite_rule()
wordpress功能函數(shù)add_rewrite_rule(),添加一個重寫規(guī)則,該規(guī)則將URL結(jié)構(gòu)轉(zhuǎn)換為一組查詢變量。
用法:
add_rewrite_rule( string $regex, string|array $query, string $after = 'bottom' )
描述
$after參數(shù)中任何不是' bottom '的值都將導(dǎo)致該規(guī)則被放置在重寫規(guī)則的頂部。
參數(shù)
$regex
(string) (必需) 要匹配請求的正則表達式。
$query
(string|array) (必需) 這個重寫規(guī)則的相應(yīng)查詢是不同的。
$after
(string) (可選) 新規(guī)則的優(yōu)先級。接受'top'或'bottom'。
默認值: 'bottom'
更多信息
add_rewrite_rule()允許你為WordPress指定額外的重寫規(guī)則。它最常與add_rewrite_tag()一起使用(它允許WordPress識別自定義post/get變量)。
來源:
文件: wp-includes/rewrite.php
function add_rewrite_rule( $regex, $query, $after = 'bottom' ) {
global $wp_rewrite;
$wp_rewrite->add_rule( $regex, $query, $after );
}
更新日志:

用戶貢獻的筆記
(由安東尼艾登貢獻- 1年前)
下面是一個簡單的例子,說明如何注冊一個新的重寫規(guī)則,并將其傳遞給PHP文件進行渲染:
1. 設(shè)置一個規(guī)則:
add_action( 'init', function() {
add_rewrite_rule( 'myparamname/([a-z0-9-]+)[/]?$', 'index.php?myparamname=$matches[1]', 'top' );
} );
2. 沖洗永久鏈接。轉(zhuǎn)到WP Admin >設(shè)置>永久鏈接>保存。這不會在您添加此代碼后自動發(fā)生
3.白名單查詢參數(shù):
add_filter( 'query_vars', function( $query_vars ) {
$query_vars[] = 'myparamname';
return $query_vars;
} );
4. 添加一個處理程序?qū)⑵浒l(fā)送到模板文件:
add_action( 'template_include', function( $template ) {
if ( get_query_var( 'myparamname' ) == false || get_query_var( 'myparamname' ) == '' ) {
return $template;
}
return get_template_directory() . '/template-name.php';
} );
(由tomasdev貢獻- 4年前)
WP Codex網(wǎng)站上的內(nèi)容,因為任何原因沒有被遷移。
注意:當(dāng)使用$matches[]檢索匹配URL的值時,捕獲組數(shù)據(jù)從1開始,而不是0。
重要提示:不要忘記在修改規(guī)則后刷新和重新生成重寫規(guī)則數(shù)據(jù)庫。從WordPress管理屏幕,選擇設(shè)置->永久鏈接,只需點擊保存更改,無需任何更改。
(由Samuel Elh貢獻- 5年前)
一個簡單的例子:處理規(guī)則來創(chuàng)建一個訂閱者頁面,希望它能有所幫助。
add_action('init', function() {
$page_id = 2; // update 2 (sample page) to your custom page ID where you can get the subscriber(s) data later
$page_data = get_post( $page_id );
if( ! is_object($page_data) ) { // post not there
return;
}
add_rewrite_rule(
$page_data->post_name . '/subscriber/([^/]+)/?$',
'index.php?pagename=' . $page_data->post_name . '&my_subscribers=1&my_subscriber=$matches[1]',
'top'
);
});
現(xiàn)在在你的頁面模板中(如果你有一個模板,或者在過濾這個自定義頁面的內(nèi)容時),你可以通過調(diào)用get_query_var('my_subscriber')來獲得顯示的訂閱者片段,但是首先,將'my_subscriber'傳遞給查詢變量:
add_filter('query_vars', function($vars) {
$vars[] = "my_subscriber";
return $vars;
});
(由iqbalbary貢獻- 3年前)
添加重寫規(guī)則查詢?yōu)榭蛇x查詢,希望對您有所幫助。
function custom_rewrite_rule() {
add_rewrite_rule('^nutrition/?([^/]*)/?','index.php?page_id=12&food=$matches[1]','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);
這里的主要內(nèi)容是補充?在正則表達式的開頭。像什么? ([^ /]*)
現(xiàn)在,您可以在將使用查詢的地方為可選查詢設(shè)置默認值。
$food = $wp_query->get( 'food' );
if( isset($food) && !empty($food) ) {
$nutrition = $food;
}else{
$nutrition = 'strawberry'; //default value
}
現(xiàn)在,對于http://example.com/nutrition/strawberry或http://example.com/nutrition/,您將得到相同的結(jié)果
(由立花明- 4個月前貢獻)
(從法典)
使用自定義模板與自定義querystring
讓我們假設(shè)您正在創(chuàng)建一個“營養(yǎng)”頁面來顯示營養(yǎng)信息。這個頁面使用了一個自定義模板,并使用了兩個變量:food和variety。在你的主題根目錄下創(chuàng)建一個名為my-custom-template.php的文件,如下所示:
/**
* Template Name: Nutritional Information
*/
get_header();
global $wp_query;
echo 'Food : ' . $wp_query->query_vars['food'];
echo '
';
echo 'Variety : ' . $wp_query->query_vars['variety'];
// ... more ...
get_footer();
使用這個模板,創(chuàng)建一個頁面。在添加新頁面的屏幕上,從模板下拉框中選擇“營養(yǎng)信息”。您可以為標(biāo)題或內(nèi)容留空。單擊“發(fā)布”以發(fā)布該頁。從“所有頁面”屏幕中寫下創(chuàng)建頁面的ID。將鼠標(biāo)光標(biāo)移動到頁面標(biāo)題上,可以在Web瀏覽器的狀態(tài)欄中顯示鏈接信息。您將看到URL中POST=后面的ID。在本例中,假設(shè)ID為12。
使用add_rewrite_tag()讓W(xué)ordPress知道自定義的查詢字符串變量food和variety。將以下代碼添加到functions.php文件中,
function custom_rewrite_tag() {
add_rewrite_tag('%food%', '([^&]+)');
add_rewrite_tag('%variety%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);
您可以調(diào)用頁面如下:
http://example.com/index.php?page_id=12&food=milkshake&variety=strawberry
該頁面將顯示由querystring變量傳遞的兩個值。
現(xiàn)在,不必向頁面?zhèn)鬟f丑陋的querystring變量,您可以設(shè)置重寫規(guī)則來創(chuàng)建一些定制的漂亮url。向functions.php文件添加以下規(guī)則,并將頁面ID 12替換為您在上述步驟中研究的ID。不要忘記點擊保存更改在永久鏈接設(shè)置。(參考以上重要)
function custom_rewrite_rule() {
add_rewrite_rule('^nutrition/([^/]*)/([^/]*)/?','index.php?page_id=12&food=$matches[1]&variety=$matches[2]','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);
用戶可以訪問相同的頁面與以下URL:
http://example.com/nutrition/milkshakes/strawberry/
(由立花明- 4個月前貢獻)
(從法典)
基本用法
你可以檢索任何頁面通過指定ID在URL如下:
http://example.com/?p=95
如果向functions.php文件添加以下規(guī)則,就可以提供自定義的URL來訪問。
function custom_rewrite_basic() {
add_rewrite_rule('^leaf/([0-9]+)/?', 'index.php?page_id=$matches[1]', 'top');
}
add_action('init', 'custom_rewrite_basic');
注意:當(dāng)使用$matches[]檢索匹配URL的值時,捕獲組數(shù)據(jù)從1開始,而不是0。
重要提示:不要忘記在修改規(guī)則后刷新和重新生成重寫規(guī)則數(shù)據(jù)庫。從WordPress管理屏幕,選擇設(shè)置->永久鏈接,只需點擊保存更改,無需任何更改。
現(xiàn)在,您可以訪問與
http://example.com/leaf/95
(由立花明- 4個月前貢獻)
(從法典)
使用重寫規(guī)則重定向到index.php以外的腳本
當(dāng)重定向到自定義PHP腳本時,$redirect參數(shù)的工作方式略有不同,因為WordPress將這些重定向委托給.htaccess,而不是自己處理它們。因此,查詢字符串變量應(yīng)該寫成$1,而不是$matches[1]。假設(shè)我們重定向到一個自定義PHP腳本,從我們前面的例子中添加相同的重寫規(guī)則如下所示:
function custom_rewrite_rule() {
add_rewrite_rule('^nutrition/([^/]*)/([^/]*)/?','url/to/my/script.php?food=$1&variety=$2','top');
}
add_action('init', 'custom_rewrite_rule', 10, 0);
(由Md Aminur Islam貢獻- 2個月前)
用可選參數(shù)重寫規(guī)則。
// siteurl.com/wpdocs-product-category/edit-product-category/43 for edit product category
add_rewrite_rule(
'^wpdocs-product-category/([^/]*)/([^/]*)/?',
'index.php?pagename=wpdocs-product-category&wpdocs-pro-category-action=$matches[1]&wpdocs-product-cat-id=$matches[2]',
'top'
);
// Product Category Add Page
// siteurl.com/wpdocs-product-category/add-product-category for add product category
add_rewrite_rule(
'^wpdocs-product-category/([^/]*)/?',
'index.php?pagename=wpdocs-product-category&wpdocs-pro-category-action=$matches[1]',
'top'
);
在處理之前過濾允許的查詢變量。
add_filter( 'query_vars', function( $vars ) {
$vars[] = 'wpdocs-pro-category-action';
$vars[] = 'wpdocs-product-cat-id';
$vars[] = 'wpdocs-category-action';
return $vars;
} );
檢索查詢參數(shù)值
$pro_category_action = get_query_var( 'wpdocs-pro-category-action' );
$product_cat_id = get_query_var( 'wpdocs-product-cat-id' );