web-dev-qa-db-fra.com

Quelle est la différence entre les hooks, les filtres et les actions?

Il semble que les termes “crochet”, “filtre” et “action” soient utilisés de manière interchangeable. Quelle est la différence entre eux? Que font-ils? Comment puis-je les utiliser?

1
cjbj

Crochets est le nom collectif des filtres et actions . Les deux sont destinés à changer le comportement normal des fonctions. Par programmation, il n’ya pas de grande différence, comme vous pouvez le constater dans le fait que dans le code source WP , l’ajout d’une action est la même que l'ajout d'un filtre.

La différence est dans l'utilisation. Vous utilisez une action pour changer complètement le comportement d'une fonction ou pour ajouter quelque chose à une fonction existante. Vous utilisez un filtre pour changer le résultat d'une fonction ou d'une variable. Lire un peu plus sur la théorie ici .

Exemple

Disons qu'il s'agit de votre fichier de modèle de thème index.php:

$me = 'I love Star Wars';
$you = 'I love Star Trek';
$me = apply_filters ('do_force', $me);
$you = apply_filters ('do_force', $you);
do_action ('echo_me_you', $me, $you);

Ensuite, dans le functions.php de votre thème ou dans le fichier php principal de votre plugin, vous pouvez définir des filtres et des actions. Par exemple:

add_filter ('do_force','wpse_do_force');
function wpse_do_force ($string) {
  str_replace ('Trek','Wars', $string); // change all occurences of 'Trek ' to 'Wars'
  return $string;
  }

Le filtre n'a aucun effet sur $me, mais il change de $you, car il recherche la chaîne 'Trek' et la change en 'Wars'. Ainsi, une fois les filtres appliqués, nous aimons tous les deux Star Wars.

Maintenant, le code va à l'action. Cela peut être très simple:

add_action ('echo_me_you', 'wpse_echo_neutral');
function wpse_echo_neutral ($me, $you) {
  echo $me;
  echo $you;
  }

Mais l'action peut être rendue aussi puissante que vous le souhaitez. Vous pouvez par exemple annuler les filtres en modifiant toutes les occurrences de 'Wars' en 'Trek':

add_action ('echo_me_you', 'wpse_echo_trek');
function wpse_echo_trek ($me, $you) {
  str_replace ('Wars','Trek', $me);
  str_replace ('Wars','Trek', $you);
  echo $me;
  echo $you;
  }

Comment fonctionne cette fonction?

Lorsque WordPress commence à assembler une page, il lit d'abord votre functions.php. Là, il rassemble toutes les actions et les filtres que vous ajoutez. Il les met dans une file d'attente. Ensuite, lorsqu'il trouve un do_action ou apply_filters, il prend la file d'attente correspondante et exécute les actions/filtres une par une, dans l'ordre dans lequel il les a trouvées.

Ainsi, dans l'exemple ci-dessus, une fonction définie est déclenchée sur le filtre do_force et deux fonctions sont déclenchées sur l'action echo_me_you. Premièrement, il applique le filtre sur $me, puis il applique le filtre sur $you, puis il exécute la fonction wpse_echo_neutral et enfin wpse_echo_trek.

Priorités

Une fois votre thème (enfant) chargé, les plugins (et le thème parent) sont également chargés. Ils ajoutent des actions et des filtres aussi. Ainsi, le filtre que vous avez écrit pour the_title peut sembler ne pas fonctionner, car le filtre est ignoré par un autre filtre dans un plugin. C’est là que les priorités sont utiles.

Les priorités vous permettent de déterminer la place de votre filtre/action dans la file d'attente. Donc, si vous définissez ceci:

add_filter ('the_title', 'wpse_the_title', 999, 2);

La priorité 999 doit garantir que ce filtre est exécuté en tant que dernier filtre de la file d'attente (le nombre 2 correspond au nombre de paramètres transmis au filtre/à l'action).

Cela ne marche pas!

Oui, cela se produit, semble-t-il. Comme vous pouvez le voir dans l'exemple ci-dessus, si vous avez une action qui remplace un filtre, vous pouvez faire ce que vous voulez avec votre filtre et cela n'aura aucun effet. Votre configuration d'enfant/parent et de plugins peut être si complexe que vous devez déboguer avec soin.

La première étape consiste à inclure quelque chose comme echo 'GOT HERE' en tant que première ligne de votre fonction. Cela vous dira si votre filtre/action est appelé. Si ce n'est pas le cas, vous décrochez trop tard. Regardez ce code qui pourrait être dans votre functions.php:

add_action ('wp_footer','wpse_footer');
function wpse_footer() {
  add_action ('wp_head', 'wpse_head');
  }
function wpse_head() {
  echo 'GOT HERE';
  }

Cela ne fonctionnera pas, car do_action (wp_head) est déjà exécuté par WP quand il rencontre do_action (wp_footer). Donc, si vous ajoutez une action à la file d'attente wp_head à ce moment-là, cela n'aura aucun effet. Vérifiez toujours l'ordre des hooks lorsque vous ajoutez des actions aux hooks WordPress natifs. Une erreur courante consiste à mettre en file d'attente les fichiers de script/style à partir d'un widget. Comme vous pouvez le voir dans l'ordre de raccordement, dynamic_sidebar, où les widgets sont connectés à la page WordPress, est exécuté après le wp_enqueue_scripts.

Il existe d'autres raisons pour lesquelles un filtre/une action peut ne pas être exécuté du tout. Par exemple, parce que WP ignore un filtre dans certaines circonstances. Ici, vous n’avez pas d’autre choix que de fouiller dans le code source (ou de demander ici sur WPSE).

La deuxième étape , une fois que vous êtes sûr que le filtre est appelé, consiste à lui attribuer une priorité très élevée, afin de vous assurer qu'il n'est pas annulé. En outre, désactivez tous les plugins pour éliminer les interférences.

Troisième étape , si votre fonction est appelée et que les interférences sont éliminées, mais que cela ne fonctionne toujours pas, cela a probablement quelque chose à voir avec vos propres compétences de codage. Vérifiez les fautes de frappe, faites écho aux résultats intermédiaires, etc. pour trouver où vous vous êtes trompé.

Conclusion

Le système de hooks est un système puissant mais parfois déroutant pour modifier le comportement de WordPress lui-même ou de ses plugins/thèmes. Parce que tout le monde utilise des hameçons populaires, les résultats peuvent être inattendus. Cependant, la plupart des problèmes peuvent être résolus en examinant attentivement l'ordre des hameçons et les priorités.

3
cjbj