在WordPress上似乎有一个颇有争议的观点flush_rewrite_rules()
作用
根据《食品法典》的规定,不鼓励在计算机上使用此功能init
行动挂钩。
However:
在我正在开发的插件中,我使用
add_feed()
添加一个提要。法典说这应该在
init
并且需要一次性使用
flush_rewrite_rules()
.
看到我的困境了吗?我需要add_feed()
在…上init
, 这需要flush_rewrite_rules()
.
因此flush_rewrite_rules()
在…上init
, 这打破了所有自定义帖子类型重写规则和永久链接,导致404页。
So my question is: 如何做到这一点?
这是我目前的init
, 这与问题有关:
add_action( \'init\', \'my_foobar\' );
function my_foobar() {
// getting some settings
add_feed( $url, $callback );
flush_rewrite_rules();
}
任何帮助都将不胜感激。谢谢:)
最合适的回答,由SO网友:fuxia 整理而成
在运行刷新之前,必须检查现有的重写规则。如果您的源名称为test
, 它们存储在钥匙下面\'feed/(feed|rdf|rss|rss2|atom|test)/?$\'
和\'(feed|rdf|rss|rss2|atom|test)/?$\'
.
所以这应该可以做到:
add_action( \'init\', function()
{
$name = \'test\';
$registered = FALSE;
add_feed( $name, \'test_feed\' );
$rules = get_option( \'rewrite_rules\' );
$feeds = array_keys( $rules, \'index.php?&feed=$matches[1]\' );
foreach ( $feeds as $feed )
{
if ( FALSE !== strpos( $feed, $name ) )
$registered = TRUE;
}
// Feed not yet registered, so lets flush the rules once.
if ( ! $registered )
flush_rewrite_rules( FALSE );
});