web-dev-qa-db-fra.com

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

J'ai examiné l'API de plug-in un peu plus en profondeur récemment et je me demandais quelles différences réelles il y avait entre les crochets de filtre et d'action . Ce sont tous les 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?

49
Sruly

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ées à être utilisées lorsque le noyau de WordPress, un plugin ou un thème vous donne l’opportunité d’insérer votre code à un moment donné et d’effectuer une ou plusieurs des actions suivantes:

  1. Utilisez echo pour injecter du contenu HTML ou autre contenu dans le tampon de réponse,
  2. Modifier l'état de la variable globale pour une ou plusieurs variables, et/ou
  3. Modifie les paramètres passés à 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

Crochets de filtre se comportent de manière très similaire à Action Hooks mais leur utilisation prévue consiste à recevoir une valeur et à éventuellement renvoyer une version modifiée de la valeur. Un crochet de filtre peut également être utilisé comme un crochet 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 crochet 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 c'était passé. 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 aparté J'avais le sentiment que les crochets de filtre étaient entravés dans les versions précédentes de WordPress, car ils ne recevraient qu'un 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 crochet posts_where; Je crois que quelques versions en arrière n’acceptaient qu’un seul paramètre: "where" class SQL de la requête actuelle, mais maintenant, il accepte à la fois la clause where et une référence à une instance courante de la classe WP_Query c'est invoquer le crochet.

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, mais 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 que si un développeur choisit d’utiliser un crochet d’action ou un crochet de filtre ou inversement, il télégraphie son intention et donc donne des conseils au développeur ou au plug-in qui pourrait être en utilisant le crochet. Essentiellement, ils disent soit "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!

56
MikeSchinkel

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

Et si vous regardez la fonction principale do_action(), elle est très similaire à la fonction principale apply_filters(), 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.

11
trusktr

Dans Word simple.

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

Les filtres sont ces PHP fonctions qui renvoient la sortie.

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


Comment utiliser?

Action:

Consultez ci-dessous des exemples simples dans votre fichier thème functions.php.

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

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)
 function 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 d’Actions)
 function test2 () {
 echo "Test 2"; 
} 
 add_action ('test', 'test2', 1); 
 
 function 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 dans functions.php
 function 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éez un dossier 'simple' dans le répertoire /wp-content/plugins/.
  2. Créez un fichier nommé 'simple.php' et ajoutez le code ci-dessous.
/* 
 * Nom du plugin: Simple Plugin 
 */
 Function test_callback_function () {). [
 Echo "From plugin"; 
} 
 add_action ('test', 'test_callback_function'); 

Activez maintenant notre Simple plugin à partir du tableau de bord d’administrateur de WordPress.

Allez au menu plugin et activez-le.

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

 Test 1De 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 default pour toutes les actions ajoutées.]

Les filtres

Vérifiez les exemples ci-dessous:

Exemple simple PHP:

 $ 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_nom_filtre ', fonction ($ old_data) {
 retourner un tableau (' trois ',' quatre '); 
}); 

Au-dessus du programme, imprimez la sortie:

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

Ici, nous avons ajouté le filtre my_filter_name et modifié la sortie array( 'one', 'two' ) existante avec array( 'three', 'four' ) sans modifier les fichiers thème/plug-in.


4
maheshwaghmare