web-dev-qa-db-fra.com

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

J'écris un plugin qui instancie un type de message personnalisé (entre autres). C'est 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 plug-in 'normal', vous le feriez dans un hook d'activation - ce qui ne sera pas possible pour un plugin à utiliser absolument car ces hooks ne sont pas disponibles.

Étant donné que ceci est censé être un événement "ponctuel" après l'enregistrement du type de publication personnalisé, serait-il judicieux 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 fois. Ever .

Suis-je sur la bonne voie?

(edit): Je viens d'essayer; mon CPT donne une erreur 404 non trouvée, les règles de réécriture ne fonctionnent donc pas :-(

(edit # 2): J'ai essayé la solution pour accéder à la variable globale, comme indiqué dans cette question: Comment effacer de manière fiable les règles de réécriture sur plusieurs sites? - Je vais mettre à jour mon exemple de code ci-dessus pour le montrer. Malheureusement, l'erreur 404 persiste quand 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 simplement qu'elles ne soient pas utilisées. Je suis perdu.

9
C C

La fonction flush_rewrite_rules est fiable dans certains contextes, comme un thème ou un plugin basé sur les hooks, mais je ne sais pas si cela fonctionne pour un mu-plugin

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

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

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 du rewrite_rules, il les reconstruira, c'est également ce que fait la méthode flush_rules.

Il existe des points dans le flux d'exécution de WordPress où des fonctions comme celle-ci ne sont pas disponibles. même dans le noyau 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 reconstituer. Comme je peux le constater, vous ne voulez les vider qu’au premier appel et c’est une bonne chose.

P.S: Je ne suis pas un fan de l'auto-promotion, mais j'ai aussi écrit un article à propos de cela il y a très longtemps et je pense qu'il en est toujours ainsi.

2
Andrei

Si votre plugin mu a des options, je mettrais la couleur juste après les avoir mises à jour:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
0