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

48

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

Évidemment, je vois que des actions sont appelées lorsque des actions ont lieu et des filtres 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 différences réelles existe-t-il entre elles?

    
posée Sruly 29.08.2010 - 14:27
la source

3 réponses

55

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 de WordPress, 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 actions suivantes:

  1. Utilisez echo pour injecter du code HTML ou un autre contenu dans le tampon de réponse,
  2. Modifier l'état des variables globales pour une ou plusieurs variables et / ou
  3. Modifiez les paramètres transmis à votre fonction hook (en supposant que le hook était 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 prévue est de recevoir une valeur et de renvoyer potentiellement 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 utilisant un crochet de filtre doit renvoyer (une version modifiée de ) le premier paramètre, il a été passé. Une erreur courante des débutants consiste à oublier de renvoyer cette valeur!

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

En aparté , 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 cependant, 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_where hook; Je crois que quelques versions en arrière n’acceptaient qu’un seul paramètre, la classe "where" de la requête actuelle, mais acceptent maintenant la clause where et , une référence à l’instance actuelle du WP_Query class qui appelle le hook.

Alors, quelle est la vraie différence?

En réalité, les crochets de filtre sont un sur-ensemble de crochets d'action. 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 ou elle fait avec le crochet de filtre.

Orientation et intention de télégraphier

Mais ce n'est probablement pas ce qui est important. Je pense que ce qui est important, c’est que les développeurs qui choisissent d’utiliser un crochet d’action ou un crochet de filtre, ou vice-versa, télédiffusent leur intention et par conséquent orientent les internautes. ou développeur de plugin qui pourrait utiliser le crochet. En substance, ils disent: "Je vais vous appeler, faites ce que vous devez faire" OU "I ' Je vais vous transmettre cette valeur à modifier mais assurez-vous de la renvoyer . "

Donc, en fin de compte, , 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 aide!

    
réponse donnée MikeSchinkel 29.08.2010 - 15:57
la source
11

Si vous regardez le source de la fonction add_action() core, 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.

Alors 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 filtrage 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.

    
réponse donnée trusktr 29.06.2013 - 20:41
la source
3

En termes 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 utilisant 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:

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

  1. Exemple un: (exemple PHP simple)
function test() {
     echo "Output";
}

test();

Au-dessus du programme, imprimez le résultat:

Output

[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 "Output";
}
add_action( 'test', 'test1' );

do_action( 'test' );

Au-dessus du programme, imprimez le résultat:

Output

[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 le résultat:

Test 2Test 1

[NOTE: Ici, do_action('test') fonctionne comme une fonction d’appel. Et exécutez 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) Ajouter 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 le résultat:

Test 1

Maintenant, créez un exemple de plug-in pour vérifier son fonctionnement pour les développeurs tiers.

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

Activez notre plug-in Simple à partir du tableau de bord de l'administrateur WordPress.

Allez au menu plug-in et activez-le.

Après avoir activé le plugin ci-dessus, programmez la sortie:

Test 1From plugin

[NOTE: Si nous ajoutons la priorité de 1 à 9 à notre action de plug-in, la sortie sera imprimée comme suit:

From pluginTest 1

En effet, WordPress considère le 10 priority by default pour toutes les actions ajoutées.]

Filtres

Vérifiez les exemples ci-dessous:

Exemple PHP simple:

$data = array( 'one', 'two' );
print_r( $data );

Au-dessus du programme, imprimez le résultat:

Array ( [0] => one [1] => two )
  1. Exemple un: (Utilisation simple du filtre)
$data = apply_filters( 'my_filter_name', array( 'one', 'two' ) );
print_r( $data );

add_filter( 'my_filter_name', function( $old_data ) {
     return array( 'three', 'four' );
});

Au-dessus du programme, imprimez le résultat:

Array ( [0] => three [1] => four )

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

réponse donnée maheshwaghmare 03.02.2017 - 16:37
la source

Lire d'autres questions sur les étiquettes