Remarque: il s'agit d'une réponse incomplète qui sera développée progressivement
Le seul moyen fiable de vider les règles de réécriture dans plusieurs sites, sans potentiellement détruire la structure de permalien du contexte principal et / ou de tout autre contexte de blog (selon la façon dont vous basculez vers et depuis), est de vider les règles de réécriture dans un contexte donné comme celui-ci. :
global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();
Ce qui précède garantit que la structure de permalien correcte pour le contexte donné est récupérée et définie avant de construire les règles de réécriture et de valider les modifications dans la base de données.
Cela ne s'applique pas à un seul site où le contexte n'a pas d'importance, car il n'y a qu'un seul contexte.
flush_rewrite_rules()
à mon avis, est erroné dans la prémisse qu'il suppose le contexte correct, mais ne prend pas en compte notre utilisation de switch_to_blog
ce qui change complètement le contexte et nous laisse en territoire dangereux si nous essayons de renverser les règles, potentiellement.
Voici à quoi flush_rewrite_rules()
ressemblent les internes de :
function flush_rewrite_rules( $hard = true ) {
global $wp_rewrite;
$wp_rewrite->flush_rules( $hard );
}
Je ne peux pas penser à une raison pour laquelle cela ne devrait pas ressembler à ceci:
function flush_rewrite_rules( $hard = true ) {
global $wp_rewrite;
$wp_rewrite->init(); //hello....
$wp_rewrite->flush_rules( $hard );
}
... surtout quand on considère que le constructeur de WP_Rewrite
quoi fait quoi? Il fait ça ...
public function __construct() {
$this->init();
}
Touchant votre premier point de préoccupation pour approfondir cette ligne de pensée,
Alors, comment le plugin procéderait-il au vidage fiable des règles de réécriture dans le multisite :
- Quand un nouveau site est créé, pour le site?
Voyons ce que WordPress Core appellera notamment au cours de ce processus:
- premier
wpmu_create_blog()
- qui appelle alors
install_blog()
qui à son tour appellepopulate_options()
populate_options()
définit ensuite la structure de permalien par défaut dans le tableau des options
- après
install_blog()
a couru, wp_install_defaults()
puis est appelé
wp_install_defaults()
vide ensuite les règles de réécriture du site nouvellement créé avant de revenir finalement au blog actuel via restore_current_blog()
.
Il est important de noter que cela wp_install_defaults()
efface les règles exactement comme je l'ai suggéré ci-dessus:
$wp_rewrite->init();
$wp_rewrite->flush_rules();
... car c'est le seul moyen de s'assurer que les permalink_structure
règles correctes et sont établies pour le contexte actuel.
Également dans le problème mis en évidence dans le problème Github , la raison pour laquelle l'utilisateur a rencontré le comportement suivant:
Lorsqu'un nouveau site est créé, il rompt les permaliens de niveau post uniquement sur le site de niveau supérieur - dans la plupart des configurations de permaliens mais pas toutes:
Ces 2 formats fonctionnent correctement.
Par défaut - Fonctionne comme prévu
Jour et nom - Fonctionne comme prévu
... parce que si le blog principal a une structure de permalien Day & Name /%year%/%monthnum%/%day%/%postname%/
, quand un nouveau site est créé, il a aussi une structure de permalink Day & Name /%year%/%monthnum%/%day%/%postname%/
par défaut, c'est pourquoi aucun problème notable ne se présente lorsque le plugin Yoast SEO flushes réécrit règles sur le shutdown
crochet.
$wp_rewrite
afin de pouvoir parcourir et réinitialiser chaque site réseau? J'ai un grand site réseau qui souffre de quelques problèmes de permalien sur les plugins personnalisés. Faire un plugin qui ajoute un cron semble exagéré car il serait toujours de les réinitialiser. Les boucler avec une URL personnalisée serait idéal mais je ne sais pas comment le faire pour tous les sites.