Disons que vous avez un plugin qui doit effacer les règles de réécriture. Tout se fait correctement avec le crochet d’activation et l’ajout de la couleur plus tard, pour que tout soit lisse et compatible.
Et puis un beau jour, quelqu'un essaie de l'exécuter sur plusieurs sites.
Au lieu d'un scénario simple comme:
Vous avez maintenant des scénarios de cauchemar comme:
En théorie, ça devrait marcher, non? En pratique, cela se passe mal de manière spectaculaire:
$wp_rewrite
peut provenir du mauvais siteswitch_to_blog()
ne suit pas non plus l'état de réécriturePar exemple, vous pouvez comprendre ce problème: comment essayer de le faire correctement supprime les liens permanents sur le site principal chaque fois que le nouveau site est créé .
Alors, comment se passerait le plugin de manière fiable en vidant les règles de réécriture en multisite :
Remarque: ceci est une réponse incomplète qui sera développée progressivement
Le seul moyen fiable de supprimer les règles de réécriture dans un site multisite, sans détruire potentiellement la structure de liens permanents du contexte principal ou de tout autre blog (en fonction de la méthode utilisée et du type de commutation) consiste à supprimer les règles de réécriture dans un contexte donné, comme ceci :
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 la construction des règles de réécriture et la validation des modifications dans la base de données.
Ceci ne s'applique pas à un site unique où le contexte n'a pas d'importance, car il n'y a qu'un seul contexte.
flush_rewrite_rules()
est, à mon avis, erroné en ce sens qu’il assume le bon contexte mais ne prend pas en compte notre utilisation de switch_to_blog
pour lequel le contexte change complètement et nous laisse en territoire dangereux si nous essayons de supprimer des règles, potentiellement.
Voici à quoi ressemble le contenu de flush_rewrite_rules()
:
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
fait quoi? Ça fait ça ...
public function __construct() {
$this->init();
}
En ce qui concerne votre premier point de préoccupation pour approfondir cette ligne de pensée,
Alors, comment le plugin va-t-il supprimer les règles de réécriture dans multisite :
- Quand un nouveau site est créé, pour le site?
Regardons ce que le noyau WordPress appellera notamment durant ce processus:
wpmu_create_blog()
install_blog()
qui à son tour appelle populate_options()
populate_options()
définit la structure permalien par défaut dans la table d'optionsinstall_blog()
, wp_install_defaults()
est appeléwp_install_defaults()
efface les règles de réécriture du site nouvellement créé avant de revenir au blog actuel via restore_current_blog()
.Il est important de noter que 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 d’être sûr que le permalink_structure
et les règles sont construits 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éé, les permaliens de niveau publication ne sont dissociés que sur le site de niveau supérieur - dans la plupart des configurations de permalien, mais pas toutes:
Ces 2 formats fonctionnent correctement.
Par défaut - Fonctionne comme prévu
Day & Name - Fonctionne comme prévu
... c'est parce que si le blog principal a une structure permalien Day & Name /%year%/%monthnum%/%day%/%postname%/
, lorsqu'un nouveau site est créé, il possède également une structure permalien Day & Name /%year%/%monthnum%/%day%/%postname%/
par défaut, ce qui explique pourquoi aucun problème notable ne se pose lorsque le plugin Yoast SEO efface les règles de réécriture sur le hook shutdown
.