web-dev-qa-db-fra.com

méthodes do_action et hook

J'essaie de comprendre comment fonctionnent les méthodes de hook dans WordPress. Je comprends que, lorsque do_action s’appelle WP, _ cherche tous les écouteurs enregistrés et les appelle en fonction de la priorité définie.

Comment WordPress Core collecte-t-il toutes les méthodes de raccordement enregistrées dans différents fichiers? Par exemple, j'ai déclaré add_action pour wp_head dans mon pied de page. Sera-ce exécuté? Il semble donc que WordPress devrait collecter toutes les données itérantes sur tous les fichiers?

S'il vous plaît expliquer ceci.

2
Ptzhub

Votre analogie ici est partiellement correcte, mais incomplète:

Je comprends que lorsque do_action est appelée, wp recherche tous les écouteurs enregistrés et les appelle en fonction de la priorité définie.

Vous devez tenir compte de ce qui se passe lorsque vous appelez add_action. WordPress ne recherche jamais les instructions add_action, il les a dans une liste. Lorsque vous appelez add_action, il met à jour une liste de rappels à appeler lorsque cette action se produit.

Dans cet esprit, il est plus utile d’utiliser une analogie d’événements.

  • do_action( 'init' ) Lance l'action 'init'
  • add_action('init', 'myfunction' ) Lorsque l'événement init se produit, appelez myfunction
  • function myfunction() {} Ah l'événement init s'est produit

L'analogie avec les événements aide énormément à comprendre le fonctionnement des actions et des filtres, car de nombreux problèmes surviennent lorsque vous ne comprenez pas le timing.

Prenons votre exemple d'appeler add_action dans le pied de page pour l'action wp_head. wp_head se déclenche lorsque wp_head() est appelé, ce qui devrait se produire dans l'en-tête entre les balises <header>. Si nous essayons d’ajouter une action dans le pied de page, elle sera ajoutée et le prochain appel de wp_head() sera déclenché. Mais wp_head a déjà été appelé, c'est trop tard. C'est comme demander à un enfant "n'oubliez pas de faire votre sac avant la fête" juste après la fin de la fête.

En gardant cela à l'esprit, j'ai quelques règles générales et recommandations qui pourraient servir d'heuristique pour un code plus maintenable:

  • Placez tout le code dans les fonctions qui déclenchent des événements. init, after_theme_setup, wp_head et admin_init devraient en couvrir la majeure partie
  • Le seul code en dehors d'un raccord ou d'un filtre serait des fichiers de modèle et les appels add_action initiaux
  • N'ajoutez pas de filtres et de crochets dans les modèles, ne les créez pas dans functions.php ou dans un plugin, ou si ces fichiers utilisent des instructions include ou require pour un dossier inclus

Dans certaines situations, vous voudrez enfreindre ces règles, généralement pour éviter la récursivité lors de la sauvegarde d'éléments, etc., mais ces exceptions doivent être rares. Expérimentez et voyez ce qui fonctionne, et regardez ce post qui montre quelles actions sont déclenchées quand, et ce qui est sans danger à utiliser à ce moment-là

Une note finale, les actions et les filtres sont la même chose. En interne, ils sont traités de la même manière, mais il existe des différences importantes si vous voulez que les choses fonctionnent bien:

  • Les actions font les choses
  • Les filtres modifient les choses
  • Les actions n'ont rien à retourner
  • Les filtres sont passés ce qui est "filtré" comme premier argument, et le retournent toujours ou une version modifiée
  • Les filtres s'appellent beaucoup, donc ne faites jamais de gros travaux dans les filtres, cela ralentira massivement les choses, vous ne ferez que modifier, le travail est à quoi les actions sont destinées
  • Évitez de vous accrocher aux filtres de traduction et d’échappement, cela peut être dangereux et a un impact majeur sur les performances car ce sont les filtres les plus couramment appelés.
  • Il existe une action/un filtre particulièrement dangereux appelé all, qui se déclenchera pour chaque filtre et chaque crochet. Utile parfois pour le débogage, mais je recommanderais plutôt d'utiliser un plugin tel qu'un moniteur de requête.
5
Tom J Nowell

Toutes vos actions appartiennent à votre functions.php, en supposant que vous construisez un thème. C'est ici que vous ajoutez des actions à certains événements dans vos modèles.

Maintenant, une fois que functions.php WP est lu, il contient une liste d’actions qu’il est supposé entreprendre à certains moments de vos modèles de thème. Il existe plusieurs crochets d'action prédéfinis, tels que wp_head() et wp_footer(), qui sont des raccourcis pour do_action('wp_head') et do_action('wp_footer'). Ils sont définis, donc les plugins ont des emplacements standards où ils peuvent ajouter leur action. Vous pouvez également définir vos propres crochets d'action avec do_action.

Ainsi, par exemple, si vous souhaitez ajouter la même image à la fin de chaque publication, vous devez définir dans votre functions.php l'action suivante:

add_action ('my_post_image', 'generate_my_post_image');
function generate_my_post_image () {
    echo '<img src="path_to_my_image">';
    }

Ensuite, dans votre index.php vous auriez:

while (have_posts()) {
    ... generate your post ...
    do_action ('my_post_image');
    }
0
cjbj