wordpress功能函数add_rewrite_rule(),添加一个重写规则,该规则将URL结构转换为一组查询变量。

用法:

add_rewrite_rule( string $regex, string|array $query, string $after = 'bottom' )

描述

$after参数中任何不是' bottom '的值都将导致该规则被放置在重写规则的顶部。

参数

$regex

(string) (必需) 要匹配请求的正则表达式。

$query

(string|array) (必需) 这个重写规则的相应查询是不同的。

$after

(string) (可选) 新规则的优先级。接受'top'或'bottom'。

默认值: 'bottom'

更多信息

add_rewrite_rule()允许你为WordPress指定额外的重写规则。它最常与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 );

}

更新日志:
WordPress功能函数add_rewrite_rule() (https://www.wpzt.net/) WordPress开发教程 第1张
用户贡献的笔记

(由安东尼艾登贡献- 1年前)

下面是一个简单的例子,说明如何注册一个新的重写规则,并将其传递给PHP文件进行渲染:

1. 设置一个规则:

add_action( 'init', function() {

add_rewrite_rule( 'myparamname/([a-z0-9-]+)[/]?$', 'index.php?myparamname=$matches[1]', 'top' );

} );

2. 冲洗永久链接。转到WP Admin >设置>永久链接>保存。这不会在您添加此代码后自动发生

3.白名单查询参数:

add_filter( 'query_vars', function( $query_vars ) {

$query_vars[] = 'myparamname';

return $query_vars;

} );

4. 添加一个处理程序将其发送到模板文件:

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网站上的内容,因为任何原因没有被迁移。

注意:当使用$matches[]检索匹配URL的值时,捕获组数据从1开始,而不是0。

重要提示:不要忘记在修改规则后刷新和重新生成重写规则数据库。从WordPress管理屏幕,选择设置->永久链接,只需点击保存更改,无需任何更改。

(由Samuel Elh贡献- 5年前)

一个简单的例子:处理规则来创建一个订阅者页面,希望它能有所帮助。

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'

);

});

现在在你的页面模板中(如果你有一个模板,或者在过滤这个自定义页面的内容时),你可以通过调用get_query_var('my_subscriber')来获得显示的订阅者片段,但是首先,将'my_subscriber'传递给查询变量:

add_filter('query_vars', function($vars) {

$vars[] = "my_subscriber";

return $vars;

});

(由iqbalbary贡献- 3年前)

添加重写规则查询为可选查询,希望对您有所帮助。

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);

这里的主要内容是补充?在正则表达式的开头。像什么? ([^ /]*)

现在,您可以在将使用查询的地方为可选查询设置默认值。

$food = $wp_query->get( 'food' );

if( isset($food) && !empty($food) ) {

$nutrition = $food;

}else{

$nutrition = 'strawberry'; //default value

}

现在,对于http://example.com/nutrition/strawberry或http://example.com/nutrition/,您将得到相同的结果

(由立花明- 4个月前贡献)

(从法典)

使用自定义模板与自定义querystring

让我们假设您正在创建一个“营养”页面来显示营养信息。这个页面使用了一个自定义模板,并使用了两个变量:food和variety。在你的主题根目录下创建一个名为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();

使用这个模板,创建一个页面。在添加新页面的屏幕上,从模板下拉框中选择“营养信息”。您可以为标题或内容留空。单击“发布”以发布该页。从“所有页面”屏幕中写下创建页面的ID。将鼠标光标移动到页面标题上,可以在Web浏览器的状态栏中显示链接信息。您将看到URL中POST=后面的ID。在本例中,假设ID为12。

使用add_rewrite_tag()让WordPress知道自定义的查询字符串变量food和variety。将以下代码添加到functions.php文件中,

function custom_rewrite_tag() {

add_rewrite_tag('%food%', '([^&]+)');

add_rewrite_tag('%variety%', '([^&]+)');

}

add_action('init', 'custom_rewrite_tag', 10, 0);

您可以调用页面如下:

http://example.com/index.php?page_id=12&food=milkshake&variety=strawberry

该页面将显示由querystring变量传递的两个值。

现在,不必向页面传递丑陋的querystring变量,您可以设置重写规则来创建一些定制的漂亮url。向functions.php文件添加以下规则,并将页面ID 12替换为您在上述步骤中研究的ID。不要忘记点击保存更改在永久链接设置。(参考以上重要)

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文件添加以下规则,就可以提供自定义的URL来访问。

function custom_rewrite_basic() {

add_rewrite_rule('^leaf/([0-9]+)/?', 'index.php?page_id=$matches[1]', 'top');

}

add_action('init', 'custom_rewrite_basic');

注意:当使用$matches[]检索匹配URL的值时,捕获组数据从1开始,而不是0。

重要提示:不要忘记在修改规则后刷新和重新生成重写规则数据库。从WordPress管理屏幕,选择设置->永久链接,只需点击保存更改,无需任何更改。

现在,您可以访问与

http://example.com/leaf/95

(由立花明- 4个月前贡献)

(从法典)

使用重写规则重定向到index.php以外的脚本

当重定向到自定义PHP脚本时,$redirect参数的工作方式略有不同,因为WordPress将这些重定向委托给.htaccess,而不是自己处理它们。因此,查询字符串变量应该写成$1,而不是$matches[1]。假设我们重定向到一个自定义PHP脚本,从我们前面的例子中添加相同的重写规则如下所示:

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个月前)

用可选参数重写规则。

// 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;

} );

检索查询参数值

$pro_category_action = get_query_var( 'wpdocs-pro-category-action' );

$product_cat_id = get_query_var( 'wpdocs-product-cat-id' );