Utilizzare l'hook wp init per richiamare altri hook?
Vorrei sapere se questa è considerata una buona pratica nello sviluppo di temi o plugin WordPress.
add_action('init','all_my_hooks');
function all_my_hooks(){
// alcune operazioni di inizializzazione qui e poi
add_action('admin_init',-----);
add_action('admin_menu',----);
// altri hook simili
}
grazie

In generale: Sì, attendi un hook dedicato per avviare il tuo codice. Mai lanciare un'istanza di oggetto direttamente nel namespace globale. Ma raramente è necessario usare init
.
Agganciati il più tardi possibile. Se il tuo codice viene eseguito con wp_head
, non usare un hook precedente. Puoi persino concatenare gli hook:
add_action( 'wp_head', 'first_callback' );
function first_callback()
{
// fai qualcosa
// poi
add_action( 'wp_footer', 'second_callback' );
}
Per quanto riguarda l'hook init
: usa invece wp_loaded
. Questo viene eseguito dopo init
e dopo la chiamata a ms_site_check()
. In questo modo eviti di eseguire il tuo plugin su un sottosito non valido in un'installazione multi-sito. Tutto il resto rimane uguale.

grazie mille per la tua risposta, ho ancora un dubbio: è meglio caricare tutti gli altri hook all'interno di wp_loaded o caricarli separatamente? Mi chiedo se aggiungendo gli hook in wp_loaded verranno agganciati prima invece che dopo admin_init o admin_menu?

Non vedo i grandi vantaggi di questa pratica, per questi motivi:
Le tue funzioni di callback non vengono chiamate durante la registrazione
Le funzioni add_action
e add_filter
aggiungono solo una voce alla variabile globale $wp_filter
che contiene tutti i filtri e le azioni. Vedi sorgente. Non chiamano la tua funzione. Il tuo codice verrà eseguito solo quando vengono chiamati do_action
e apply_filters
(con il nome appropriato dell'hook), cosa che avviene molto dopo nel punto in cui dovrebbero essere quegli hook.
Potresti dire che facendo così la variabile globale $wp_filter
diventerà più grande => sarà richiesta più memoria. Ma penso che creare una nuova funzione abbia lo stesso problema.
Organizzazione del codice
Mettere tutto in una funzione ti obbliga a ricordare tutti gli hook in ogni file del tuo tema/plugin. Non faresti qualcosa come:
- in
header.php
: aggiungi hook e funzioni di callback per le cose che accadono nell'header (come il menu, la registrazione degli script) - in
content.php
: aggiungi hook e funzioni di callback per filtrare il contenuto admin-menu.php
: aggiungi hook e funzioni di callback per aggiungere menu admin
(supponendo che questi file siano nel tuo tema/plugin)
Invece di questo, dovresti:
- mettere solo le funzioni di callback in
header.php
,content.php
,admin-menu.php
- e mettere tutti gli hook in una funzione separata in un altro file
=> Questo renderebbe difficile capire cosa succede quando guardi il contenuto del file header.php
. Dovresti cercare per sapere quando queste callback vengono attivate.
E pensa alla situazione in cui hai più classi nel tuo tema/plugin. Metti tutti gli hook di tutte le classi in un unico posto? O ogni classe ha una funzione wrapper che contiene tutti gli hook? È troppo ridondante!
Oltre a queste ragioni, penso sia una questione di stile personale :). Vedo alcuni framework come Hybrid che fanno quello che hai detto. A volte mi rende difficile approfondire quei framework!
