Le meilleur moyen de flush_rewrite_rules pour un type de message personnalisé, dans un plugin mu-plugins?

9

J'écris un plugin qui instancie un type de message personnalisé (entre autres). Il s'agit d'un plugin multisite et réside dans le répertoire mu-plugins .

Quelle est la meilleure pratique pour gérer flush_rewrite_rules () dans cette situation? Pour un plugin `` normal '', vous le feriez dans un hook d'activation - ce qui ne sera pas possible pour un plugin indispensable car ces hooks ne sont pas disponibles.

Étant donné que cela est censé être un événement "ponctuel" après l'enregistrement du type de publication personnalisé, serait-il sensé de faire quelque chose comme ceci dans ma classe qui enregistre le CPT:

private function check_flush_my_CPT() {
    global $wp_rewrite;
    if ( !get_option('my_plugin_firstrun') ) {
        $wp_rewrite->init();
        $wp_rewrite->flush_rules(true);
        update_option('my_plugin_firstrun', 'yes');
    }
}

public function register_my_CPT() {
   // do all the CPT setup steps for the $args array...  

   register_post_type('my_CPT', $args);
   $this->check_flush_my_CPT();
}

add_action( 'init', array(&$this, 'register_my_CPT' ) );

Ainsi, l'enregistrement CPT se produit à chaque action 'init' - mais si j'ai ce droit, les règles de réécriture ne se produisent qu'une seule fois. Jamais .

Suis-je sur la bonne voie?

(modifier): Je viens de l'essayer; mon CPT donne une erreur 404 introuvable, donc les règles de réécriture ne fonctionnent pas :-(

(edit # 2): J'ai essayé la solution pour accéder à la variable globale comme indiqué dans cette question: Comment vider de manière fiable les règles de réécriture sur multisite? - Je mettrai à jour mon exemple de code ci-dessus pour le montrer. Malheureusement, j'obtiens toujours une erreur 404 lorsque j'essaie de charger un CPT. Je vois que les règles de réécriture sont stockées dans la base de données, il semble qu'elles ne soient pas utilisées. Je suis perdu.

CC
la source
Il n'y a vraiment aucun moyen approprié de le faire. C'est fondamentalement le meilleur au moment d'écrire ce commentaire.
Pieter Goosen
@PieterGoosen - merci, je l'ai vu plus tôt, et j'ai mis à jour ma question pour envisager l'autre solution. Ne fonctionne toujours pas. Je me demande si j'ai cassé quelque chose en exécutant flush_rewrite_rules () avant de voir l'autre réponse? Peut-être que je dois supprimer mon site de test et le rétablir, pour tester avec précision la bonne procédure?
CC
Cela pourrait être possible. L'exécution incorrecte des règles de réécriture de vidage dans un multisite peut enfreindre toutes les règles de réécriture de votre réseau. Si j'étais là, je recommencerais tout simplement. J'espère juste que c'est une installation locale et non un site en direct ;-)
Pieter Goosen
à droite ... je vais essayer ça. Et non, c'est un site de test et je pense que je peux effacer la base de données et réinitialiser la configuration réseau dans mon sommeil maintenant! :-)
CC

Réponses:

2

La flush_rewrite_rulesfonction est fiable dans certains contextes comme un thème ou un plugin basé sur des hooks mais je ne sais pas si cela fonctionne pour unmu-plugin

Ma déclaration est basée sur le fait que WordPress est initialisé de cette manière:

  • appeler le wp-settings.phpfichier
  • appeler le do_action( 'muplugins_loaded' );crochet, ici votre plugin est initialisé
  • appeler $GLOBALS['wp_rewrite'] = new WP_Rewrite();ici la méthode flush_rulesest initialisée et disponible à partir de maintenant
  • do_action( 'setup_theme' );est appelé et je parie tout mon argent que ce crochet flush_rewrite_rulesfonctionnera

Solution?

Personnellement, je trouve fiable la suppression de l'option rewrite_rules.

delete_option('rewrite_rules');

ou

update_option('rewrite_rules', '' );

Chaque fois que WordPress manquera, rewrite_rulesil les reconstruira, c'est aussi ce que fait la flush_rulesméthode.

Il y a des points dans le flux d'exécution de WordPress où des fonctions comme celle-ci ne sont pas disponibles. même au cœur de WordPress, j'ai trouvé cette déclaration

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

Le seul problème serait la performance, ne le faites pas à chaque demande car il est difficile de les reconstruire. Comme je peux le voir, vous ne voulez les vider qu'au premier appel et c'est une bonne chose.

PS: je ne suis pas un fan de l'auto-promo mais j'ai aussi écrit un article à ce sujet il y a longtemps et je pense que cela tient toujours

Andrei
la source
0

Si votre plugin mu a des options, je mettrais le flush juste après les avoir mis à jour:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
Leon Francis Shelhamer
la source