WordPress功能函数add_rewrite_rule()
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 );
}
更新日志:
用户贡献的笔记
(由安东尼艾登贡献- 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' );