Utilizzare wp init hook per chiamare altri hook?
2 risposta
- voti
-
- 2012-10-09
Ingenerale: sì,attendi che un hook dedicatoiniziiltuo codice. Mai semplicemente lancia un'istanza di oggettonello spazio deinomiglobale. Ma
init
è raramentenecessario.Ti colleghiilpiùtardipossibile. Seiltuoprimo codice vieneeseguito su
wp_head
,non utilizzare un hookprecedente. Puoi anche ganci a cascata :add_action( 'wp_head', 'first_callback' ); function first_callback() { // do something // then add_action( 'wp_footer', 'second_callback' ); }
Riguardo all'hook
init
: usainvecewp_loaded
. Funziona dopoinit
e dopo che è stato chiamatoms_site_check()
. In questomodoeviti dieseguireilplug-in su un sito secondarionon validoin un'installazionemultisito. Tuttoil resto è lo stesso.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.-
+1per `wp_loaded`e informazioni su MS.+1 for `wp_loaded` and MS info.
- 3
- 2012-10-09
- kaiser
-
graziemilleper latua risposta,ancora un dubbio,che èmeglio caricaretuttigli altri hook all'interno di wp_loaded o caricarli separatamente?mi chiedo se aggiungo hookin wp_loaded,verranno agganciatiprimainvece diessere agganciati dopo admin_init o 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
-
ganci a cascatanon è unproblema?cascading hooks isn't an issue ?
- 0
- 2012-10-09
- atinder
-
No,perché dovrebbeessere?Chiamail secondo hook solo seilprimo è stato utile.No, why should it be? Call the second hook only if the first was useful.
- 0
- 2012-10-09
- fuxia
-
- 2012-10-10
Non vedoi grandi vantaggi di questapratica,per questimotivi:
Letuefunzioni di callbacknon vengono chiamate durante la registrazione
Lefunzioni
add_action
eadd_filter
aggiungono solo una voce alla variabileglobale$wp_filter
che contienetuttii filtrie le azioni. Vedi sorgente . Non chiama latuafunzione. Iltuo codice verràeseguito solo quandodo_action
eapply_filters
vengono chiamati (conilnome hook appropriato),il che accade moltotardi nelpuntoin cui dovrebberoessere quegli hook.Sipotrebbe dire che cosìfacendo la variabileglobale
$wp_filter
diventeràpiùgrande=>piùmemoria richiesta. Mapenso che creare unanuovafunzione abbia lo stessoproblema.Organizzazione del codice
Metteretuttoin una funzioneti costringe a ricordaretuttigli hookin ognifileneltuotema/plugin. Non faresti qualcosa delgenere:
- in
header.php
: aggiungi hooke funzioni di callbackper le cose che accadononell'header (comemenu,script di registrazione) - in
content.php
: aggiungi hooke funzioni di callbackperfiltrarei contenuti -
admin-menu.php
: aggiungi hooke funzioni di callbackper aggiungereilmenu admin
(supponi che queifile sianoinseritineltuotema/plugin)
Invece di quello,devi:
- inserisci solofunzioni di callbackin
header.php
,content.php
,admin-menu.php
- e mettituttigli hookin unafunzione separatain un altrofile
=> Questoti renderà difficile sapere cosa succede quandoguardiil contenuto delfile
header.php
. Devieseguire una ricercaper sapere quando vengono attivati questi callback.Epensa alla situazionein cui haipiù classineltuotema/plugin. Mettituttii ganci ditutte le classiin un unicoposto? O ogni classe ha unafunzione wrapper che contienetuttigli hook? Ètroppo ridondante!
Oltre a queste ragioni,penso che sia uno stilepersonale :). Vedo che alcuniframework come Hybridfanno quello che hai detto. A voltemi rende difficile scavarein queiframework!
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!
Voglio sapere se è unabuonapraticain base altema WordPress o allo sviluppo diplugin.
grazie