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.
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:
init
, after_theme_setup
, wp_head
et admin_init
devraient en couvrir la majeure partieadd_action
initiauxfunctions.php
ou dans un plugin, ou si ces fichiers utilisent des instructions include
ou require
pour un dossier inclusDans 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:
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.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');
}