添加馈送和刷新重写规则

时间:2013-11-27 作者:Mecha

在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();
}
任何帮助都将不胜感激。谢谢:)

1 个回复
最合适的回答,由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 );
});

结束