Différence entre les crochets de filtre et d'action?


51

J'ai examiné l'API de plug-in un peu plus en profondeur récemment et je me demandais quelles étaient les différences réelles entre les hooks de filtre et d'action . Ce sont tous deux des événements qui reçoivent des données en tant que paramètre et ils semblent tous deux capables de faire la même chose.

Évidemment, je vois que les actions sont appelées lorsque des actions ont lieu et que les filtres sont appelées lorsque des données sont manipulées, mais cela semble être simplement une différence de dénomination sémantique.

Outre la sémantique et à quoi elles servent, quelles sont les véritables différences entre elles?

Réponses:


58

Bonjour @Sruly :

Vous avez à peu près répondu à votre propre question, mais je vais élaborer un peu.

Crochets d'action

Les Actions Hooks sont destinés à être utilisés lorsque le noyau WordPress ou un plugin ou un thème vous donne la possibilité d'insérer votre code à un moment donné et d'effectuer l'une ou plusieurs des opérations suivantes:

  1. Utilisé echopour injecter du contenu HTML ou autre dans le tampon de réponse,
  2. Modifier l'état de la variable globale pour une ou plusieurs variables et / ou
  3. Modifiez les paramètres transmis à votre fonction hook (en supposant que le hook a été appelé par do_action_ref_array()au lieu de, do_action()car ce dernier ne prend pas en charge le passage de variables par référence .)

Crochets de filtre

Les crochets de filtre se comportent de manière très similaire aux crochets d'action, mais leur utilisation est destinée à recevoir une valeur et à éventuellement renvoyer une version modifiée de la valeur. Un hook de filtre peut également être utilisé comme un hook d’action, c’est-à-dire pour modifier une variable globale ou générer du HTML, en supposant que c’est ce que vous devez faire lorsque le hook est appelé. Une chose qui est très importante à propos des crochets de filtre et dont vous n'avez pas à vous soucier avec Action Hook est que la personne qui utilise un crochet de filtre doit renvoyer (une version modifiée de) le premier paramètre qu'il a été transmis. Une erreur courante chez les débutants est d'oublier de renvoyer cette valeur!

Utilisation de paramètres supplémentaires pour fournir un contexte dans les crochets de filtre

En passant, j’ai eu l’impression que les crochets de filtre étaient entravés dans les versions précédentes de WordPress car ils ne recevraient qu’un seul paramètre; c'est-à-dire qu'ils obtiendraient une valeur à modifier, mais aucun deuxième ou troisième paramètre pour fournir un contexte. Dernièrement et positivement, il semble que l’équipe principale de WordPress ait ajouté (pour moi) avec joie des paramètres supplémentaires à Filter Hooks afin que vous puissiez découvrir plus de contexte. Un bon exemple est le posts_wherecrochet. Je pense que quelques versions, dans leur version précédente, n'acceptaient qu'un seul paramètre, celui de la classe SQL "where" de la requête actuelle, mais acceptent maintenant la clause where et une référence à l'instance actuelle de la WP_Queryclasse qui appelle le hook.

Alors, quelle est la vraie différence?

En réalité, les Filter Hooks sont un super ensemble de Action Hooks. Le premier peut faire tout ce que le dernier peut faire et un peu plus, même si le développeur n'a pas la responsabilité de renvoyer une valeur avec le crochet d'action qu'il fait avec le crochet de filtre.

Donner des orientations et télégraphier l'intention

Mais ce n'est probablement pas ce qui est important. Je pense que ce qui est important, c’est qu’un développeur qui choisit d’utiliser un crochet d’action ou un crochet de filtrage, ou inversement, télégraphie son intention et donne ainsi des conseils à l’éditeur ou au développeur du plug-in qui pourrait utiliser le crochet. Essentiellement, ils disent: "Je vais vous appeler, faites ce que vous devez faire" OU "Je vais vous transmettre cette valeur à modifier, mais assurez-vous de la renvoyer ."

Donc, finalement, je pense que les conseils fournis par le choix du type d’hameçon constituent la valeur réelle de la distinction . OMI, de toute façon.

J'espère que cela t'aides!


Pour moi, il semblerait que vous auriez pu utiliser des filtres pour tout, car retourner une variable est facultatif en PHP. Tout le monde sait pourquoi les développeurs WordPress ont choisi deux termes distincts? Est-ce uniquement pour des raisons sémantiques? Techniquement, je n'en vois pas la nécessité ...
TheStoryCoder

2
@TheStoryCoder "Est-ce uniquement pour des raisons sémantiques?" Il semble que ce soit exactement ce que ma réponse a expliqué, il y a cinq (5) ans ...?
MikeSchinkel

11

Si vous regardez le source de la add_action()fonction principale, c'est juste un wrapper pour la add_filter()fonction ...

Et si vous regardez la do_action()fonction principale, celle-ci est très similaire à la apply_filters()fonction principale, avec une différence essentielle: elle ne renvoie pas de valeur.

Qu'est-ce que cela signifie? les actions sont comme des filtres, sauf qu'une action ne renvoie pas de valeur, vous ne pouvez donc pas modifier les données. Cela montre qu'il était simple de créer le mécanisme d'action de WordPress en copiant simplement le mécanisme de filtre et en ne renvoyant pas de valeur. En gros, tout ce que vous pouvez faire avec une action est simplement d’exécuter une fonction sans modifier une valeur.


5

En mots simples.

Les actions sont les fonctions PHP qui exécutent la sortie.

Les filtres sont les fonctions PHP qui renvoient la sortie.

Mise à jour: Nous pouvons étendre tout plugin qui utilise les actions et les filtres sans y modifier le code. En ajoutant des filtres et des actions dans notre propre thème ou plugin.


Comment utiliser?

Action:

Vérifiez ci-dessous des exemples simples dans votre functions.phpfichier de thème .

  1. Exemple un: (exemple PHP simple)
test de fonctionnalité() {
     echo "Sortie";
}

tester();

Au-dessus du programme, imprimez la sortie:

Sortie

[NOTE: Ici test () appelle simplement la fonction. Et exécutez la fonction de rappel 'test'.]


  1. Exemple deux: (utilisation simple de l'action)
fonction test1 () {
     echo "Sortie";
}
add_action ('test', 'test1');

do_action ('test');

Au-dessus du programme, imprimez la sortie:

Sortie

[NOTE: Ici, do_action('test')fonctionne comme une fonction d'appel. Et exécutez la fonction de rappel 'test1'.]


  1. Exemple trois: (autre utilisation des actions)
fonction test2 () {
     echo "Test 2";
}
add_action ('test', 'test2', 1);

fonction test1 () {
     echo "Test 1";
}
add_action ('test', 'test1', 2);

do_action ('test');

Au-dessus du programme, imprimez la sortie:

Test 2Test 1

[NOTE: Ici, do_action('test')fonctionne comme une fonction d'appel. Et exécuter des fonctions de rappel sur ses priorités.

La fonction de rappel 'test1' a la priorité 2 et 'test2' a la priorité 1.]

Si les priorités changent comme 'test1' avec priorité 1 et 'test2' avec priorité 2, la sortie sera:

Test 1Test 2

  1. Exemple quatre: (support tiers) Ajoutez le code ci-dessous dansfunctions.php
fonction test1 () {
     do_action ('test_before');
     echo "Test 1";
     do_action ('test_after');
}
add_action ('test', 'test1');

do_action ('test');

Au-dessus du programme, imprimez la sortie:

Test 1

Créez maintenant un exemple de plug-in pour vérifier son fonctionnement pour les développeurs tiers.

  1. Créer un dossier 'simple' dans le /wp-content/plugins/répertoire.
  2. Créez un fichier nommé 'simple.php' et ajoutez le code ci-dessous.
/ *
* Nom du plugin: Simple Plugin
* /
fonction test_callback_function () {
     echo "Du plugin";
}
add_action ('test', 'test_callback_function');

Maintenant, activez notre plugin simple à partir du tableau de bord d'administrateur WordPress.

Allez au menu plugin et activez-le.

Après avoir activé le plugin ci-dessus, programmez le résultat:

Test 1From plugin

[NOTE: Si nous ajoutons la priorité pour l’action de notre plugin de 1 à 9, alors le résultat sera imprimé comme suit:

De pluginTest 1

Parce que WordPress considère le 10 priority by defaultpour toutes les actions ajoutées.]

Les filtres

Vérifiez les exemples ci-dessous:

Exemple PHP simple:

$ data = array ('un', 'deux');
print_r ($ data);

Au-dessus du programme, imprimez la sortie:

Tableau ([0] => un [1] => deux)
  1. Exemple 1: (utilisation simple du filtre)
$ data = apply_filters ('mon_filtre_nom', tableau ('un', 'deux'));
print_r ($ data);

add_filter ('mon_filtre_nom', fonction ($ old_data) {
     matrice de retour ('trois', 'quatre');
});

Au-dessus du programme, imprimez la sortie:

Tableau ([0] => trois [1] => quatre)

Ici, nous avons ajouté le filtre my_filter_nameet changer la sortie existante array( 'one', 'two' )avec array( 'three', 'four' )sans changer le thème / fichiers plugin.



Merci @ maheshwaghmare pour un truc aussi simple. s'il vous plaît écrivez à propos de 'Filtres' aussi
Adi

Qu'entendez-vous exactement par "bientôt"?
Rapti

@ Rapi Désolé pour le retard. Ce soir, je vais ajouter la réponse liée aux filtres. À l'avenir, je créerai un article descriptif sur les crochets (actions et filtres).
maheshwaghmare

@ maheshwaghmare a tergiversé beaucoup? : P

Bonne explication, j'ai une meilleure compréhension maintenant
budiantoip
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.