Utiliser wp init hook pour appeler d'autres hooks?
2 réponses
- votes
-
- 2012-10-09
Engénéral: Oui,attendez un hook dédiépour démarrer votrepropre code. Jamais ,il suffit de lancer uneinstance d'objet dans l'espace denomsglobal. Mais
init
est rarementnécessaire.Vous vous connectez leplustardpossible. Si votrepremier code s'exécute sur
wp_head
,n'utilisezpas de hook antérieur. Vouspouvezmême crochetsen cascade :add_action( 'wp_head', 'first_callback' ); function first_callback() { // do something // then add_action( 'wp_footer', 'second_callback' ); }
Concernant le hook
init
: utilisezplutôtwp_loaded
. Cela s'exécute aprèsinit
et après l'appel dems_site_check()
. De cettefaçon,vous évitez d'exécuter votreplugin sur un sous-siteinvalide dans uneinstallationmulti-site. Tout le resteestpareil.In general: Yes, wait for a dedicated hook to start your own code. Never just throw an object instance into the global namespace. But
init
is rarely necessary.You hook in as late as possible. If your first code runs on
wp_head
do not use an earlier hook. You can even cascade hooks:add_action( 'wp_head', 'first_callback' ); function first_callback() { // do something // then add_action( 'wp_footer', 'second_callback' ); }
Regarding the
init
hook: Usewp_loaded
instead. That runs afterinit
and afterms_site_check()
was called. This way you avoid to run your plugin on an invalid sub site in a multi-site installation. Everything else is the same.-
+1pour `wp_loaded`et MSinfo.+1 for `wp_loaded` and MS info.
- 3
- 2012-10-09
- kaiser
-
mercibeaucouppour votre réponse,encore un doute,quiestmieux de chargertous les autres hooks à l'intérieur de wp_loaded ou de les charger séparément?Jeme demande sij'ajoute des hooks dans wp_loaded,ils seront accrochésplustôt au lieu de devenir accro après admin_init ou admin_menu?thanks a lot for your response, still a doubt, which is better load all other hooks inside wp_loaded or load them separately ? i wonder if i add hooks in wp_loaded they will be hooked earlier instead of getting hooked after admin_init or admin_menu ?
- 0
- 2012-10-09
- atinder
-
les crochetsen cascadene sontpas unproblème?cascading hooks isn't an issue ?
- 0
- 2012-10-09
- atinder
-
Non,pourquoi devrait-il l'être?Appelez le deuxième hook uniquement si lepremier était utile.No, why should it be? Call the second hook only if the first was useful.
- 0
- 2012-10-09
- fuxia
-
- 2012-10-10
Jene voispas les grands avantages de cettepratique,pour les raisons suivantes:
Vosfonctions de rappelne sontpas appelées lors de l'inscription
Lesfonctions
add_action
etadd_filter
ajoutent uniquement uneentrée à la variableglobale$wp_filter
qui contienttous lesfiltreset actions. Voir la source . Celan'appellepas votrefonction. Votre codene s'exécutera que lorsque lesdo_action
etapply_filters
seront appelés (avec lenom de hook approprié),ce qui arrive trèstard à l'endroit où ces crochets devraient être.Vouspourriez dire que cela augmentera lataille de la variableglobale
$wp_filter
=>plus demémoire. Maisje pense que créer unenouvellefonctionpose lemêmeproblème.Code d'organisation
Toutmettre dans une fonction vous oblige à vous souvenir detous les hooks danstous lesfichiers de votrethème/plugin. Vous ne voudriezpas faire quelque chose comme ceci:
- dans
header.php
: ajoutez des hookset desfonctions de rappelpour que les choses sepassent dans l'en-tête (comme lemenu,l'enregistrement du script) - dans
content.php
: ajoutez des hookset desfonctions de rappelpourfiltrer le contenu -
admin-menu.php
: ajoutez des hookset desfonctions de rappelpour ajouter lemenu admin
(supposons que cesfichiers soientplacés dans votrethème/plugin)
Au lieu de cela,vous devez:
- ne mettre que lesfonctions de rappel dans
header.php
,content.php
,admin-menu.php
- et placeztous les hooks dans unefonction séparée dans un autrefichier
=> Cela vous rendra difficile de savoir ce qui sepasse lorsque vous regardez le contenu dufichier
header.php
. Vous devezeffectuer une recherchepour savoir quand ces rappels sont déclenchés.Etpensez à la situation où vous avezplusieurs classes dans votrethème/plugin. Mettez-voustous les crochets detoutes les classes aumêmeendroit? Ouest-ce que chaque classe a unefonction wrapper qui contienttous les hooks? C'esttrop redondant!
Au-dessus de ces raisons,je pense que c'est un stylepersonnel :). Je vois que certains cadres comme Hybridfont ce que vous avez dit. Parfois,celame rend difficile de creuser dans ces cadres!
I don't see the big benefits of this practice, for these reasons:
Your callback functions aren't called when registering
The
add_action
andadd_filter
functions only add an entry to global variable$wp_filter
which holds all filters and actions. See source. It doesn't call your function. Your code will run only when thedo_action
andapply_filters
are called (with appropriate hook name), which happens very late in the place where those hooks should be.You might say that doing so will make the global variable
$wp_filter
getting bigger => more memory required. But I think creating a new function has the same problem.Organizing code
Putting everything in one function force you to remember all hooks in every files in your theme/plugin. You wouldn't do something like this:
- in
header.php
: add hooks and callback functions for things happen in header (like menu, registering script) - in
content.php
: add hooks and callback functions for filtering content admin-menu.php
: add hooks and callback functions to add admin menu
(assume that those files are put in your theme/plugin)
Instead of that, you have to:
- put only callback functions in
header.php
,content.php
,admin-menu.php
- and put all hooks in a separated function in another file
=> That will make you hard to know what happens when you look at the content of
header.php
file. You have to search to know when these callbacks are fired.And think about situation when you have multiple classes in your theme/plugin. Do you put all hooks of all classes in one place? Or does each class has a wrapper function that holds all hooks? It's too redundant!
Above these reason, I think it's personal style :). I see some frameworks like Hybrid does what you said. Sometimes it makes me hard to digg in those frameworks!
Je veux savoir si c'est unebonnepratique selon lethème WordPress ou le développement deplugins.
merci