web-dev-qa-db-fra.com

Comment effacer de manière fiable les règles de réécriture sur un multisite?

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:

  1. Le site WordPress est créé
  2. Le plugin est installé et activé

Vous avez maintenant des scénarios de cauchemar comme:

  1. Le plugin est installé et activé par le réseau
  2. Un nouveau site WordPress (ou une centaine) en multisite est créé

En théorie, ça devrait marcher, non? En pratique, cela se passe mal de manière spectaculaire:

  • $wp_rewrite peut provenir du mauvais site
  • switch_to_blog() ne suit pas non plus l'état de réécriture
  • la partie "postérieure" peut se produire entièrement dans un blog différent
  • tous ces autres plugins avec lesquels vous êtes censé jouer avec Nice risquent de ne pas être activés de manière cohérente sur différents sites

Par 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 :

  1. Quand un nouveau site est créé, pour le site?
  2. Lorsque le site existant est activé depuis inactif, pour le site?
  3. Quand le plugin est activé sur le réseau, pour chaque site?
  4. Quand le plugin est désactivé sur le réseau, pour chaque site?
  5. Peut-être dans d'autres scénarios, impliquant la modification du contexte global de réécriture?
20
Rarst

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:

  • premier wpmu_create_blog()
  • qui appelle ensuite install_blog() qui à son tour appelle populate_options()
  • then populate_options() définit la structure permalien par défaut dans la table d'options
  • après l'exécution de install_blog(), wp_install_defaults() est appelé
  • then 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.

11
userabuser