页面的自定义重写规则

时间:2011-01-19 作者:Dan F.

我试图让WordPress识别如下URL结构:

example.com/parent/page/{id}/{first_name}/{last_name}
基本想法是我需要访问id, first_namelast_name 在我的页面中,他们必须通过URL。所以我必须制定如下规则:

(/some_page/child_page/)/([0-9]+)/([^/]+)/([^/]+) =>
index.php?pagename=$matches[1]&id=$matches[2]&fname=$matches[3]&lname=$matches[4]
对于每个页面,使用page_rewrite_rules 滤器

问题是:如何获得每页的“pagename”?这个/some_page/child_page/ 部分我可以得到post_name 但我想念我的父母,祖父佩奇。

1 个回复
SO网友:Jan Fabry

WordPress用于识别页面的模式是(.+?), 它可以匹配任何东西,但不是贪婪的,所以它允许你在最后放一些东西。以下代码适用于WordPress 3.0.1:它将额外的模式放在列表的倒数第二位,因为最终的模式非常通用,它将匹配每个URL:

add_filter( \'page_rewrite_rules\', \'wpse7243_page_rewrite_rules\' );
function wpse7243_page_rewrite_rules( $rewrite_rules )
{
    // The most generic page rewrite rule is at end of the array
    // We place our rule one before that
    end( $rewrite_rules );
    $last_pattern = key( $rewrite_rules );
    $last_replacement = array_pop( $rewrite_rules );
    $rewrite_rules +=  array(
        \'(.+?)/([0-9]+)/([^/]+)/([^/]+)/?$\' => \'index.php?pagename=$matches[1]&id=$matches[2]&fname=$matches[3]&lname=$matches[4]\',
        $last_pattern => $last_replacement,
    );
    return $rewrite_rules;
}
请注意,页面与任何帖子一样,也可以使用<!--nextpage--> 代码段,其正常URL为/pagename/2/, 如果你也有/pagename/3/jan/fabry/ 其中3 是一个ID。您可以更改模式以在末尾包含可选的页码,因此这可以成为/pagename/3/jan/fabry/2/ 决赛在哪里2 是页码,第一个3 是ID。

如果要更改重写规则,我建议my rewrite analyzer plugin (很快在存储库中,but get the current version via Dropbox), 它可以帮助您调试这些东西。

结束

相关推荐