Différence entre les crochets de filtre et d'action?
3 réponses
- votes
-
- 2010-08-29
Bonjour @Sruly :
Vous avez àpeuprès répondu à votrepropre question,maisje vais élaborer unpeu.
Crochets d'action
Les Actions Hooks sont destinés à être utilisés lorsque le cœur de WordPress ou unplugin ou unthème vous donne lapossibilité d'insérer votre code à un certainmomentet d'effectuer une ouplusieurs des opérations suivantes:
- Utilisez
echo
pour injecter du HTML ou un autre contenu dans letampon de réponse, - Modifier l'état de la variableglobale pour une ouplusieurs variables,et/ou
- Modifiez lesparamètres passés à votrefonction hook (en supposant que le hook a été appelépar
do_action_ref_array()
au lieu dedo_action()
depuis ce dernierne prendpasen charge lepassage de variables par référence .)
Crochets defiltre
LesFiltres Hooks se comportent demanièretrès similaire aux Action Hooks mais leur utilisationprévueest de recevoir une valeuret de renvoyerpotentiellement une versionmodifiée de la valeur. Un hook defiltrepeut également être utilisé comme un hook d'action,c'est-à-direpourmodifier une variableglobale ougénérer du HTML,en supposant que c'est ce que vous devezfaire lorsque le hookest appelé. Une chosetrèsimportante àpropos des hooks defiltre dont vousn'avezpas à vous soucier avec les hooks d'actionest que lapersonne qui utilise un hook defiltre doit retourner (une versionmodifiée de ) lepremierparamètrepassé. Uneerreur courante des débutantsest d'oublier de renvoyer cette valeur!
Utilisation deparamètres supplémentairespourfournir du contexte dans les hooks defiltre
Enpassant j'ai senti que les crochets defiltre étaiententravés dans les versions antérieures de WordPress carilsne recevraient qu'un seulparamètre; c'est-à-dire qu'ils obtiendraient une valeur àmodifiermais aucun deuxième outroisièmeparamètrepourfournir un contexte. Dernièrement,et positivement cependant,il semble que l'équipe debase de WordPress aitjoyeusement (pourmoi) ajouté desparamètres supplémentaires aux Hooks defiltrage afin que vouspuissiez découvrirplus de contexte. Unbonexempleest le hook
posts_where
; Je crois que quelques versionsen arrièren'acceptaient qu'un seulparamètre étant la classe SQL "where" de la requête actuelle,maismaintenantil accepte à lafois la clause where et une référence à l'instance actuelle du ClasseWP_Query
qui appelle le hook.Quelleest donc la vraie différence?
En réalité,les Filter Hooks sont àpeuprès un sur-ensemble d'Action Hooks. Lepremierpeutfairetout ce que le secondpeutfaireet unpeuplusbien que le développeurn'aitpas la responsabilité de renvoyer une valeur avec le crochet d'action qu'il ouellefait avec le crochet defiltre.
Donner des conseilset uneintention detélégraphie
Mais cen'estprobablementpas ce quiestimportant. Jepense que ce quiestimportant,c'est que lorsqu'un développeur choisit d'utiliser un crochet d'actionpar rapport à un crochet defiltre ou vice versa,il télégraphie sonintention et ainsi donne des conseils au responsable duthème. ou développeur deplugin quipourrait utiliser le hook. Essentiellement,ils disent soit "Je vais vous appeler,faitestout ce que vous devezfaire" OU "Je ' Je vais voustransmettre cette valeur àmodifiermais assurez-vous de la renvoyer . "
Donc,finalement, Jepense que les conseilsfournispar le choix dutype de crochet sont la vraie valeur derrière la distinction . OMI,en tout cas.
J'espère que cela vous aidera!
Hi @Sruly:
You've pretty much answered your own question, but I'll elaborate a bit.
Action Hooks
Actions Hooks are intended for use when WordPress core or some plugin or theme is giving you the opportunity to insert your code at a certain point and do one or more of the following:
- Use
echo
to inject some HTML or other content into the response buffer, - Modify global variable state for one or more variables, and/or
- Modify the parameters passed to your hook function (assuming the hook was called by
do_action_ref_array()
instead ofdo_action()
since the latter does not support passing variables by-reference.)
Filter Hooks
Filter Hooks behave very similar to Action Hooks but their intended use is to receive a value and potentially return a modified version of the value. A filter hook could also be used just like an Action Hook i.e. to modify a global variable or generate some HTML, assuming that's what you need to do when the hook is called. One thing that is very important about Filter Hooks that you don't need to worry about with Action Hooks is that the person using a Filter Hook must return (a modified version of) the first parameter it was passed. A common newbie mistake is to forget to return that value!
Using Additional Parameters to Provide Context in Filter Hooks
As an aside I felt that Filter Hooks were hobbled in earlier versions of WordPress because they would receive only one parameter; i.e they would get a value to modify but no 2nd or 3rd parameters to provide any context. Lately, and positively however, it seems the WordPress core team has joyously (for me) been adding extra parameters to Filter Hooks so that you can discover more context. A good example is the
posts_where
hook; I believe a few versions back it only accepted one parameter being the current query's "where" class SQL but now it accepts both the where clause and a reference to current instance of theWP_Query
class that is invoking the hook.So what's the Real Difference?
In reality Filter Hooks are pretty much a superset of Action Hooks. The former can do anything the latter can do and a bit more albeit the developer doesn't have the responsibility to return a value with the Action Hook that he or she does with the Filter Hook.
Giving Guidance and Telegraphing Intent
But that's probably not what is important. I think what is important is that by a developer choosing to use an Action Hook vs. a Filter Hook or vice versa they are telegraphing their intent and thus giving guidance to the themer or plugin developer who might be using the hook. In essence they are saying either "I'm going to call you, do whatever you need to do" OR "I've going to pass you this value to modify but be sure that you pass it back."
So ultimately I think that guidance provided by the choice of hook type is the real value behind the distinction. IMO, anyway.
Hope this helps!
-
Ilme semble que vous auriezpu simplement utiliser desfiltrespourtout,car renvoyer une variableestfacultatifen PHP.Tout lemonde saitpourquoi les développeurs WordPress ont choisi d'avoir deuxtermes distincts?Est-ce uniquementpour des raisons sémantiques?Techniquement,je n'en voispas lanécessité ...To me it seems like you could have just used filters for everything, since returning a variable is optional in PHP. Anybody knows why WordPress developers chose to have two separate terms? Is it purely for semantic reasons? Technically I can't see the need for it...
- 0
- 2015-06-10
- TheStoryCoder
-
@TheStoryCoder _ "Est-ce uniquementpour des raisons sémantiques?" _ Il semble que c'estexactement ce quema réponseexpliquait,il y a cinq (5) ans ...@TheStoryCoder _"Is it purely for semantic reasons?"_ It seems that is exactly what my answer explained, five (5) years ago...?
- 2
- 2015-06-13
- MikeSchinkel
-
- 2013-06-29
Si vous regardez la source de lafonctionprincipale
add_action()
,c'estjuste un wrapperpour lafonctionadd_filter()
...Et si vous regardez lafonctionprincipale
do_action()
,elleesttrès similaire à lafonctionprincipaleapply_filters()
,avec une différencetrèsimportante:ellene retournepasune valeur.Alors qu'est-ce que cela signifie?les actions sont comme desfiltres,sauf qu'une actionne renvoiepas de valeur,vousne pouvez doncpasmodifier les données.Celamontre qu'il était simple de créer lemécanisme d'action de WordPressen copiant simplement lemécanisme defiltreet enne renvoyantpas de valeur.Fondamentalement,tout ce que vouspouvezfaire avec une actionest simplement d'exécuter unefonction sansmodifier une valeur.
If you look at the source for the
add_action()
core function, it's just a wrapper foradd_filter()
function...And if you look at the
do_action()
core function, it's very similar to theapply_filters()
core function, with one very key difference: it does not return a value.So what does this mean? actions are like filters, except an action does not return a value, so you cannot modify data. It shows that it was simple to create the WordPress' action mechanism by simply copying the filter mechanism, and not returning a value. Basically, all you can do with an action is simply execute a function without modifying some value.
-
- 2017-02-03
Entermes simples.
Actions sont lesfonctions PHP quiexécutent la sortie.
Les filtres sont lesfonctions PHP qui renvoient la sortie.
Mise àjour: Nouspouvons étendren'importe quelplugin qui utilise les actionset lesfiltres sans ymodifier le code. En ajoutant desfiltreset des actions dansnotreproprethème ouplugin.
Comment l'utiliser?
Action:
Consultez ci-dessous desexemples simples dans votrefichier dethème
functions.php
.- Exemple un: (exemple PHP simple)
test defonctionnalité() { echo "Sortie"; } tester();
Leprogramme ci-dessus affiche la sortie:
Production
[NOTE: Icitest () appelle simplement lafonction. Etexécutez lafonction de rappel 'test'.]
- Exemple deux: (Utilisation simple de l'action)
fonctiontest1 () { echo "Sortie"; } add_action ('test','test1'); do_action ('test');
Leprogramme ci-dessus affiche la sortie:
Production
[NOTE: Ici
do_action('test')
fonctionne comme unefonction d'appel. Etexécutez lafonction de rappel 'test1'.]
- Exempletrois: (Une autre utilisation des actions)
fonctiontest2 () { echo "Test 2"; } add_action ('test','test2',1); fonctiontest1 () { echo "Test 1"; } add_action ('test','test1',2); do_action ('test');
Leprogramme ci-dessus affiche la sortie:
Test 2 Test 1
[NOTE: Ici
do_action('test')
fonctionne comme unefonction d'appel. Etexécutez desfonctions de rappel sur sespriorités.Lafonction de rappel 'test1' a lapriorité 2et 'test2' a lapriorité 1.]
Si lespriorités changent comme «test1» avec lapriorité 1et «test2» avec lapriorité 2,le résultat sera:
Test 1 Test 2
- Exemple quatre: (assistancetierce)
Ajoutez le code ci-dessous dans
functions.php
fonctiontest1 () { do_action ('test_before'); echo "Test 1"; do_action ('test_after'); } add_action ('test','test1'); do_action ('test');
Leprogramme ci-dessus affiche la sortie:
Test 1
Maintenant,créez unexemple depluginpour vérifier sonfonctionnementpour un développeurtiers.
- Créez un dossier "simple" dans le répertoire
/wp-content/plugins/
. - Créez unfichiernommé "simple.php"et ajoutez le code ci-dessous.
/* * Nom duplugin: Plugin simple */ functiontest_callback_function () { echo "Depuis leplugin"; } add_action ('test','test_callback_function');
Maintenant,activeznotre plugin simple depuis letableau debord d'administration de WordPress.
Aller auplugin demenuet l'activer.
Après avoir activé leplugin ci-dessus,imprimez la sortie:
Test 1 àpartir duplugin
[NOTE: Sinous ajoutons lapriorité denotre action deplugin de 1 à 9,alorsil affiche la sortie comme:
Àpartir dupluginTest 1
Parce que WordPress considère la
10 priority by default
pourtoutes les actions ajoutées.]Filtres
Consultez lesexemples ci-dessous:
Exemple PHP simple:
$ data=array ('un','deux'); print_r ($ données);
Leprogramme ci-dessus affiche la sortie:
Tableau ([0]=> un [1]=> deux)
- Exemple un: (Utilisation simple dufiltre)
$ data=apply_filters ('mon_nom_filtre',array ('un','deux')); print_r ($ données); add_filter ('mon_nom_filtre',fonction ($ old_data) { return array ('trois','quatre'); });
Leprogramme ci-dessus affiche la sortie:
Tableau ([0]=>trois [1]=> quatre)
Ici,nous avons ajouté lefiltre
my_filter_name
et changez learray( 'one', 'two' )
avecarray( 'three', 'four' )
sans changer lesfichiers dethème/plugin.In simple word's.
Actions are those PHP functions which execute the output.
Filters are those PHP functions which return the output.
Updated: We can extend any plugin which use the actions and filters without modifying there code. By adding filters and actions in our own theme or plugin.
How to use?
Action:
Check below simple examples in your theme
functions.php
file.- Example One: (Simple PHP example)
function test() { echo "Output"; } test();
Above program print the output:
Output
[NOTE: Here test() simply call the function. And execute the callback function 'test'.]
- Example Two: (Simple use of Action)
function test1() { echo "Output"; } add_action( 'test', 'test1' ); do_action( 'test' );
Above program print the output:
Output
[NOTE: Here
do_action('test')
works like calling function. And execute callback function 'test1'.]
- Example Three: (Another use of Actions)
function test2() { echo "Test 2"; } add_action( 'test', 'test2', 1 ); function test1() { echo "Test 1"; } add_action( 'test', 'test1', 2 ); do_action( 'test' );
Above program print the output:
Test 2Test 1
[NOTE: Here
do_action('test')
works like calling function. And execute callback functions on it's priorities.Callback function 'test1' has priority 2 And 'test2' has priority 1. ]
If priorities are change like 'test1' with priority 1 And 'test2' with priority 2 then output will be:
Test 1Test 2
- Example Four: (3rd party support)
Add below code in
functions.php
function test1() { do_action( 'test_before' ); echo "Test 1"; do_action( 'test_after' ); } add_action( 'test', 'test1' ); do_action( 'test' );
Above program print the output:
Test 1
Now, Create sample plugin to check how it works for 3rd party Developer.
- Create folder 'simple' in
/wp-content/plugins/
directory. - Create file named 'simple.php' and add below code.
/* * Plugin Name: Simple Plugin */ function test_callback_function() { echo "From plugin"; } add_action( 'test', 'test_callback_function' );
Now, Activate our Simple plugin from WordPress admin dashboard.
Goto menu plugin and activate it.
After activate plugin above program print the output:
Test 1From plugin
[NOTE: If we add the priority for our plugin action from 1 to 9 then it print the output like:
From pluginTest 1
Because, WordPress consider the
10 priority by default
for all the added actions.]Filters
Check the below examples:
Simple PHP example:
$data = array( 'one', 'two' ); print_r( $data );
Above program print the output:
Array ( [0] => one [1] => two )
- Example One: (Simple use of Filter)
$data = apply_filters( 'my_filter_name', array( 'one', 'two' ) ); print_r( $data ); add_filter( 'my_filter_name', function( $old_data ) { return array( 'three', 'four' ); });
Above program print the output:
Array ( [0] => three [1] => four )
Here, We have added filter
my_filter_name
and change the existing outputarray( 'one', 'two' )
witharray( 'three', 'four' )
without changing the theme/plugin files.
-
Merci @maheshwaghmarepour une astuce aussi simple.veuillez également écrire sur les 'Filtres'Thanks @maheshwaghmare for such a simple trick. please write about 'Filters' too
- 0
- 2017-02-22
- Adi
-
Qu'entendez-vousexactementpar «bientôt»?What exactly do you mean by "soon"?
- 0
- 2017-04-04
- Rapti
-
@Rapti Désolépour le retard.Ce soir,je vais ajouter la réponse relative auxfiltres.À l'avenir,je créerai un article descriptif concernant les hooks (actionset filtres).@Rapti Sorry for delay. Tonight I'll add the answer related the filters. In future I'll create a descriptive article regarding Hooks( Actions & Filters ).
- 0
- 2017-04-04
- maheshwaghmare
-
Bonneexplication,j'ai unemeilleure compréhensionmaintenantGood explaination, I have a better understanding now
- 0
- 2018-02-11
- Budianto IP
-
Pourquoine pas appeler lesméthodes directementet pourquoine pasfiltrer les données directement là où c'estnécessaire?Quelest le véritable objectif desméthodes do_action,add_actionet apply_filters?Why not call the methods directly and why not filter the data directly where needed? Whats the real purpose of the methods do_action, add_action and apply_filters?
- 0
- 2018-03-18
- f_i
-
La raisonest d'étendre lafonctionnalité duthème ou duplugin sans ymodifier le code.The reason is to extend the theme or plugin functionality without modifying there code.
- 0
- 2018-03-18
- maheshwaghmare
J'ai récemmentexaminé l'API duplugin unpeuplusen profondeuret jeme demandais quelles différences réellesil y avaitentre les hooks d'actionet defiltre .Ce sonttous deux des événements qui reçoivent des donnéesen tant queparamètreet ils semblenttous les deux capables defaire lesmêmes choses.
Detoute évidence,je vois que des actions sont appelées lorsque des actions ont lieuet que desfiltres sont appelés lorsque des données sontmanipulées,mais cela semble êtrejuste une différence de dénomination sémantique.
Outre la sémantiqueet à quoiils servent,quelles sont les différences réellesentreeux?