我有一个非常特殊的要求,希望我可以在不引起混淆的情况下进行解释。我创建了一个页面模板,其中列出了从外部XML文件获得的一些属性,到目前为止,没有问题,可以说URL像这样:

http://www.example.com/properties/


每个属性有一个链接,该链接应将用户重定向到“单个属性”页面,该页面显示有关此信息的更多信息。我想知道是否有一种方法可以使链接像这样:

http://www.example.com/properties/123


其中123是该属性的ID。因此,如果我有类似properties/some_id的URL,我希望能够加载视图文件(例如single.phppage.php文件)但特定于此URL条件。

这可能吗?

#1 楼

将此添加到您主题的functions.php中,或将其放入插件中。

add_action( 'init', 'wpse26388_rewrites_init' );
function wpse26388_rewrites_init(){
    add_rewrite_rule(
        'properties/([0-9]+)/?$',
        'index.php?pagename=properties&property_id=$matches[1]',
        'top' );
}

add_filter( 'query_vars', 'wpse26388_query_vars' );
function wpse26388_query_vars( $query_vars ){
    $query_vars[] = 'property_id';
    return $query_vars;
}


这将添加一个重写规则,该规则将请求定向到/properties/,后跟任意数字页面名properties,并设置了查询变量property_id。只要确保访问您的永久链接设置页面并保存以刷新刷新规则,就将包括此新规则。

在您的page-properties.php模板中,如果设置了get_query_var('property_id'),则它将返回属性ID(如果已设置)然后不显示默认属性页面。

评论


对我来说这很接近,但是我需要添加:add_filter('init','flushRules');函数flushRules(){全局$ wp_rewrite; $ wp_rewrite-> flush_rules(); }

–tooshel
2012年11月13日17:52

@tooshel您绝对不想在每个请求上都刷新规则,这是一项昂贵的操作,会使您的网站慢下来。您只需在激活插件时或仅通过访问永久链接设置页面一次刷新规则。

–米洛
2012年11月13日20:17



是的,我明白了。 。 。但是当您进行测试时,它确实在那里!

–tooshel
2012年11月14日在20:32

更聪明的重写url regexp可能是^ properties /([[0-9] +)/?。否则它将与example / properties / 1之类的东西匹配

–瑞安·泰勒(Ryan Taylor)
2014-12-12 17:34



@RyanTaylor您确定吗?测试时,它没有捕获example / properties / 1。

–米洛
2014年12月12日在18:14

#2 楼

另一种方法是:

add_action('init', function() {
    add_rewrite_rule( '^properties/([0-9]+)/?',
                      'index.php?pagename=properties&property_id=$matches[1]',
                      'top' );
}, 10, 0);

add_action('init', function() {
    add_rewrite_tag( '%property_id%', '([^&]+)' );
}, 10, 0);


Codex重写API /添加重写规则

Codex重写API /添加重写标签

评论


接受的答案适用于4.7(和4.8),不确定您为什么认为不行。您的代码本质上是在做相同的事情,add_rewrite_tag将查询var与query_vars过滤器添加到同一数组。

–米洛
17年7月7日在17:45

@Milo可能对我不起作用,但是我再也没有4.7了,所以我无法检查。我将编辑我的答案。

–克里斯蒂安·莱斯库(Christian Lescuyer)
17年7月8日在7:28

@Milo虽然我个人更喜欢重写标签,但是仍然测试了可接受的答案并且它可以工作。不过,只是一些个人口味。

–杰克·约翰逊(Jack Johansson)♦
17年7月8日在15:36

在永久目录中使用@JackJohansson重写标记是必需的。在这种情况下,这只是WordPress从未使用的额外数据。

–米洛
17年7月8日在15:47

可以将这两个规则添加到同一方法中,最终得到一个更清洁,更有用的功能,以供重新查看并确定是否进行维护工作

–eballeste
18年7月14日在15:51