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.
Réponses:
La
flush_rewrite_rules
fonction 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:
wp-settings.php
fichierdo_action( 'muplugins_loaded' );
crochet, ici votre plugin est initialisé$GLOBALS['wp_rewrite'] = new WP_Rewrite();
ici la méthodeflush_rules
est initialisée et disponible à partir de maintenantdo_action( 'setup_theme' );
est appelé et je parie tout mon argent que ce crochetflush_rewrite_rules
fonctionneraSolution?
Personnellement, je trouve fiable la suppression de l'option rewrite_rules.
ou
Chaque fois que WordPress manquera,
rewrite_rules
il les reconstruira, c'est aussi ce que fait laflush_rules
mé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
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
la source
Si votre plugin mu a des options, je mettrais le flush juste après les avoir mis à jour:
la source