web-dev-qa-db-fra.com

add_feed et flush_rewrite_rules

Il semble y avoir un avis assez controversé sur la fonction WordPress flush_rewrite_rules().

Selon le Codex, il est fortement déconseillé d’utiliser cette fonction sur le crochet d’action init.

Cependant:

Dans un plugin sur lequel je travaille, j'utilise add_feed() pour ajouter un flux. Le Codex dit que cela devrait être exécuté sur init et nécessite l’utilisation ponctuelle de flush_rewrite_rules().

Voir mon dilemme? J'ai besoin de add_feed() sur init, ce qui nécessite flush_rewrite_rules().

Par conséquent, flush_rewrite_rules() sur init, qui enfreint toutes les règles de réécriture de type de message personnalisé et tous les liens permanents, générant 404 pages.

Ma question est donc la suivante: comment cela devrait-il être fait?

Voici ce que j'ai actuellement sur init, qui est lié au problème:

add_action( 'init', 'my_foobar' );
function my_foobar() {
    // getting some settings
    add_feed( $url, $callback );
    flush_rewrite_rules();
}

Toute aide serait grandement appréciée. Merci :)

2
Mecha

Vous devez vérifier les règles de réécriture existantes avant de lancer une séquence. Si le nom de votre flux est test, ils sont stockés sous les touches 'feed/(feed|rdf|rss|rss2|atom|test)/?$' et '(feed|rdf|rss|rss2|atom|test)/?$'.

Donc, cela devrait faire l'affaire:

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 );
});
3
fuxia