Utilizzare l'hook wp init per richiamare altri hook?

9 ott 2012, 17:32:35
Visualizzazioni: 24.9K
Voti: 13

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

0
Tutte le risposte alla domanda 2
4
17

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.

9 ott 2012 17:47:59
Commenti

+1 per wp_loaded e le informazioni su Multisite.

kaiser kaiser
9 ott 2012 17:51:32

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?

atinder atinder
9 ott 2012 21:35:35

gli hook a cascata non sono un problema?

atinder atinder
9 ott 2012 22:50:19

No, perché dovrebbe esserlo? Chiama il secondo hook solo se il primo è stato utile.

fuxia fuxia
9 ott 2012 22:56:57
0

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!

10 ott 2012 05:01:07