WordPress功能函数add_rewrite_tag()
wordpress功能函数add_rewrite_tag(),添加一个新的重写标记(如%postname%)。
用法:
add_rewrite_tag( string $tag, string $regex, string $query = '' )
描述:
$query参数是可选的。如果它被省略了,你必须确保你在' init '钩子上或之前调用它。这是因为$query默认为$tag=,为了使其工作,必须添加一个新的query var。
参数:
$tag
(string) (必需) Name of the new rewrite tag.
$regex
(string) (必需) Regular expression to substitute the tag for in rewrite rules.
$query
(string) (可选) String to append to the rewritten query. Must end in '='.
默认值: ''
更多信息
这个函数可以让WordPress知道自定义的querystring变量。通常,它与add_rewrite_rule()结合使用,为具有自定义模板的页面创建重写规则。
如果您使用这个函数声明一个已经存在的重写标记,那么现有的标记将被覆盖。
这个函数必须在init或更早的时候调用。
它的功能
通过剥离标签名称中的%符号来获取一个查询var名称:
使用名称、生成的QV名称和正则表达式调用$wp_rewrite->add_rewrite_tag()。
将QV添加为一个查询var(同样,这可以通过过滤query_vars来实现,但是向WP类中添加一个像上面那样存储“额外的”QV的函数可能会更好)
来源:
文件: wp-includes/rewrite.php
function add_rewrite_tag( $tag, $regex, $query = '' ) {
// Validate the tag's name.
if ( strlen( $tag ) < 3 || '%' !== $tag[0] || '%' !== $tag[ strlen( $tag ) - 1 ] ) {
return;
}
global $wp_rewrite, $wp;
if ( empty( $query ) ) {
$qv = trim( $tag, '%' );
$wp->add_query_var( $qv );
$query = $qv . '=';
}
$wp_rewrite->add_rewrite_tag( $tag, $regex, $query );
}
更新日志:
用户贡献的笔记
(bcworkz - 5年前贡献)
在下面的例子中,想象一个站点有一个自定义的分类“位置”,所有的帖子都被分配一个位置术语,如“巴黎”或“马德里”。我们添加了一个重写标记“%location%”来建立位置查询var。我们还添加了一个重写规则,以便正确处理诸如example.com/goto/madrid/budget-lodging/这样的URL。
add_action('init', 'add_my_rewrites');
function add_my_rewrites() {
add_rewrite_tag('%location%', '([^&]+)', 'location=');
add_rewrite_rule('^goto/([^/]*)/([^/]*)/?','index.php?location=$matches[1]&name=$matches[2]','top');
}
即使重写标签看起来就像永久链接结构标签,如果你试图在永久链接结构中使用重写标签,由WordPress生成的url将看起来像example.com/goto/%location%/budget-lodging/。正确的术语并不像您所期望的那样替代重写标记。要使您的标记表现得像一个结构标记,请使用“post_link”过滤器用适当的术语替换标记。
// Assign value to %location% rewrite tag
add_filter('post_link', 'my_filter_post_link', 10, 2 );
function my_filter_post_link( $permalink, $post ) {
// bail if %location% tag is not present in the url:
if ( false === strpos( $permalink, '%location%'))
return $permalink;
$terms = wp_get_post_terms( $post->ID, 'location');
// set location, if no location is found, provide a default value.
if ( 0 < count( $terms ))
$location = $terms[0]->slug;
else
$location = 'timbuktu';
$location = urlencode( $location );
$permalink = str_replace('%location%', $location , $permalink );
return $permalink;
}
任何时候您更改与重写API相关的东西,不要忘记刷新重写规则!这可以通过进入永久链接设置并单击Save Changes来实现,无需代码。您实际上不需要在设置屏幕上做任何更改。
(由立花明- 4个月前贡献)
(从法典)
例子
下面将注册一个名为' film_title '的标签:
function custom_rewrite_tag() {
add_rewrite_tag('%film_title%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);
?>
当您使用自定义页面模板进行重写时,这一点尤其重要。
检索重写后的URL的值
定义了重写标记之后,您现在可以使用WordPress的$wp_query变量来检索重写后的querystring变量的值。为了从重写中获得上述标记的值,你可以在你的页面模板中使用以下方法:
$wp_query->query_vars['film_title']
注意,在重写的URL上使用$_GET将不起作用,即使重写包含querystring变量。您必须使用$wp_query。