为什么每个人都把添加重写规则挂在init上

时间:2015-11-05 作者:Mark Kaplun

我发现的每个添加重写规则的示例如下

function addsomerule() {
  add_rewrite_rule(some regex,some parse result);
}

add_action(\'init\',\'addsomerule\');
这不适合我。如果rewrite_rule 选项不是空的(即,刚才没有重写规则刷新),那么将其挂接到那里有什么意义呢?

好像把它挂上了admin_init 更有意义的是,对DB的写入和重写刷新应该只发生在管理端。

是否有更合理的操作来使用此函数,或者它是init,还是使用较低级别的过滤器?

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

你说得对,没有冲水规则,add_rewrite_rule() 不起作用,原因是WordPress从数据库中获取规则add_rewrite_rule() 不将规则添加到数据库。

但是,无法使用admin_init 原因是admin_init 太晚了。

WordPress有时会打电话flush_rewrite_rules() 在之前的管理屏幕上admin_init 被激发(例如here), 确保WordPress调用时添加了规则flush_rewrite_rules() 您需要使用init (或者可能wp_loaded).

类似的方法可能会奏效:

function addsomerule() {
  if ( is_admin() ) add_rewrite_rule(some regex,some parse result);
}

add_action( \'init\',\'addsomerule\' );
它确保仅在管理请求期间添加规则。

但是if 调用函数的语句在性能方面有(少量)成本,并且考虑到add_rewrite_rule 不是很昂贵(它只向全局数组写入一个值,并且不命中db),那么可能不值得添加该条件。

此外,您并不总是能够控制站点使用的所有代码。如果一些插件调用flush_rewrite_rules() 在前端请求上,您的规则将丢失,因为只在后端添加。

出于所有这些原因,请在上添加重写规则init 不进行任何其他检查可能是正确的做法:它避免了任何问题,并且它在前端请求上增加的少量成本几乎与WordPress启动时间无关,并且在WordPress启动时丢失了。

相关推荐