如何创建自定义URL路由?


50

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

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

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

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

123该属性的ID 在哪里。因此,如果我有这样的URL,则properties/some_id希望能够加载视图文件(例如single.phppage.php文件),但特定于此URL条件。

这可能吗?

Answers:


57

将此添加到主题的functions.php中,或将其放在plugin中

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

这将添加一个重写规则,该规则将查询与设置为var的/properties/pagename之后的任何数字组合一起定向到。只要确保访问您的永久链接设置页面并保存刷新刷新规则,就可以包含此新规则。propertiesproperty_id

page-properties.php模板中,get_query_var('property_id')如果设置了属性ID ,则将返回该属性ID;如果未设置,则将显示默认属性页面。


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

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

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

3
更聪明的重写url regexp可能是^properties/([0-9]+)/?。否则,它将匹配类似example/properties/1
Ryan Taylor

@RyanTaylor您确定吗?example/properties/1测试时没有捕获到它。
米洛(Milo)2014年

9

另一种方法是:

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 /添加重写标签


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

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

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

1
@JackJohansson重写,当你使用它的标签是必要的permastruct。在这种情况下,这只是WordPress从未使用的额外数据。
米洛

可以将这两个规则添加到同一方法中,最终得到一个更干净,更有用的功能,以供您重新考虑是否进行维护工作
eballeste18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.