Pourquoi tout le monde accroche-t-il add_rewrite_rule sur init

4

Chaque exemple d’ajout de règles rewrtie que je trouve ressemble à

function addsomerule() {
  add_rewrite_rule(some regex,some parse result);
}

add_action('init','addsomerule');

Cela ne calcule pas pour moi. les ajouts aux règles de réécriture de ce type sont ignorés si l’option rewrite_rule n’est pas vide (c’est-à-dire qu’il n’ya pas eu de règles de réécriture vides pour le moment). Quel est donc l’intérêt de l’accrocher ici?

Il semble que l’accrocher à admin_init est beaucoup plus judicieux lorsqu’il écrit dans la base de données, et que la réécriture de la couleur doit donc se faire uniquement du côté de l’administrateur.

N'existe-t-il pas une action plus logique pour utiliser cette fonction ou s'agit-il d'init ou d'utiliser le filtre de niveau inférieur?

    
posée Mark Kaplun 05.11.2015 - 15:03

1 réponse

5

Vous avez raison de dire que sans règles vides, add_rewrite_rule() ne fonctionne pas et que la raison en est que WordPress extrait les règles de la base de données et que add_rewrite_rule() ne pas n'ajoute pas la règle à la base de données.

Cependant, il n'est pas possible d'utiliser admin_init . La raison en est que admin_init est trop tard.

WordPress appelle parfois flush_rewrite_rules() sur les écrans d’administration avant que admin_init ne soit déclenché (par exemple ici ), et pour être sûr que la règle est ajoutée lorsque WordPress appelle flush_rewrite_rules() , vous devez utiliser init (ou peut-être wp_loaded ).

Quelque chose comme cela pourrait fonctionner:

function addsomerule() {
  if ( is_admin() ) add_rewrite_rule(some regex,some parse result);
}

add_action( 'init','addsomerule' );

Cela garantit que la règle est ajoutée uniquement lors des requêtes de l'administrateur.

Cependant, l'instruction if qui appelle une fonction entraîne un coût (faible) en termes de performances, et considérant que add_rewrite_rule n'est pas très cher (il écrit uniquement une valeur dans un tableau global et pas frappé db), alors probablement il ne vaut pas la peine d'ajouter cette condition.

De plus, vous n’avez pas toujours le contrôle sur tout le code utilisé par votre site. Si un plugin appelle flush_rewrite_rules() sur des demandes frontales, votre règle est perdue car elle n’a été ajoutée que sur le backend.

Pour toutes ces raisons, ajouter des règles de réécriture sur init sans autre vérification est probablement la bonne chose à faire: cela évite tout problème et les faibles coûts qu’il ajoute aux demandes frontales sont à peu près inutiles et perdus dans le démarrage de WordPress. temps.

    
réponse donnée gmazzap 05.11.2015 - 17:00

Lire d'autres questions sur les étiquettes