关于wodpress中rewrite rule的部分总结

有道友提出“如何在wordpress中创建配置自己的重写规则”一问,特意整理了自己的部分理解作一总结:

关于wordpress的重写规则,可以查看wp-includes/rewrite.php源码

wordpress通过flush_rewrite_rules向options数据表保存规则内容。

通常,使用add_rewrite_rule这个函数即可实现简单的重写规则的添加动作;
还有add_rewrite_tagadd_permastruct等等,不过这些在应用简单的重写规则时没有add_rewrite_rule来得直接。

需要注意的是,add_rewrite_rule之后要想起到预期的效果,必须执行flush_rewrite_rules动作,但不建议利用代码多次执行flush操作。而应该在需要的时候再执行,比如插件启用时由register_activation_hook这个钩子发起该动作,或者需要时再到后台固定链接里点保存按钮也可以实现该动作。

— 举例 —
比如新创建个movies页面,用来介绍指定的电影信息,则该页面的完整url地址应为:

http://mydomain.com/index.php?pagename=movies&movie_name=killbill

movie_name是想传入的参数

现在需重写为

http://mydomain.com/movies/killbill

步骤:

1、add_rewrite_rule

add_action( 'init', 'wpdit_bq1579112796568320460' );
function wpdit_bq1579112796568320460() {
    // 添加该规则后需手动执行flush write rules,参考上面的说明
    add_rewrite_rule(
        // 该正则用来匹配传入的URL
        'movies/([^/]+)/?',
        // `pagename` 代表这是个页面
        // `movie_name` 用来保存匹配到内容
        'index.php?pagename=movies&movie_name=$matches[1]',
        // rewrite rules提供的其实是一组数组用来匹配传入的URL
        // 所以,当有近似的正则匹配时,总是第1个匹配到的被返回
        // 因这个重写规则为后加的特定规则,故将此添加到顶部
        'top' );
}

2、添加query_vars

wordpress内置了一组查询变量存于query_vars,不在其内的变量会被忽略;
所以需事先告诉wordpress关于movie_name是什么,并允许movie_name这个变量以便后面的引用。
添加方法:

add_filter( 'query_vars', 'wpdit_bq1579112796568320460_query_vars' );
function wpdit_bq1579112796568320460_query_vars( $query_vars )
{
    $query_vars[] = 'movie_name';
    return $query_vars;
}

最后,后台设置固定链接里,点击保存按钮后就可以访问http://mydomain.com/movies/killbill试试效果了。

可以在当前皮肤的page.php里置入下面的代码:

echo get_query_var('movie_name');

看能否显示出killbill.
wordpress rewrite rule
链接:
如何在wordpress中创建配置自己的重写规则
Need help with add_rewrite_rule
How does one flush rules on theme activation or deactivation only?

2 thoughts on “关于wodpress中rewrite rule的部分总结”

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注