Guida: Tutto sugli Hook in WordPress
Ti è mai stato detto che la soluzione al tuo problema è che devi "agganciarti" a qualcosa per fare la tua cosa o usarla add_filtersenza capire davvero perché incasina le cose? Gli hook costituiscono le fondamenta di WordPress e forniscono temi e plug-in un modo per interagire o modificare il codice In questo post analizzeremo cosa sono gli hook, come funzionano e come possiamo usarli.
Cosa sono i ganci?
Mentre WordPress esegue il suo codice (dall’inizio del caricamento delle classi, del caricamento dei plugin, del caricamento del tema, della query per la richiesta corrente e infine del rendering dell’HTML), passa attraverso una serie di "punti di controllo"; ganci. Quando viene rilevato un hook, WordPress interrompe ciò che sta facendo e controlla se ci sono funzioni (nel tema, nel plug-in o nello stesso WordPress) che sono registrate per essere eseguite su questo hook. Se ci sono, WordPress eseguirà tutte queste funzioni e poi continuerà da dove era stato interrotto.
Ciò consente a plug-in, temi e WordPress stesso di "agganciarsi" a determinati punti per aggiungere, ad esempio, fogli di stile nel <head>tag del tema, modificare il modo in cui WordPress interroga i post o semplicemente modificare il contenuto del post, se lo si desidera.
Esistono due tipi di ganci; azioni e filtri. Funzionano in modo abbastanza simile tra loro, ma con un’eccezione che esamineremo più da vicino di seguito.
Azioni e filtri
Per agganciare un’azione o un filtro, è necessario definire quale hook (in base al suo nome) si desidera utilizzare e definire un callback, che è il nome della funzione che si desidera eseguire. Nella maggior parte dei casi gli hook forniscono parametri o variabili rilevanti per l’hook.
Le azioni sono semplicemente "punti di controllo" nell’esecuzione di WordPress, dove puoi eseguire un’attività o fare eco a qualcosa. In alcuni rari casi è possibile modificare un oggetto (fornito nei parametri), in modo che tutte le successive esecuzioni funzionino con quell’oggetto modificato.
I filtri servono per modificare una variabile o un output. Tutti i filtri hook forniranno la variabile che puoi modificare come primo parametro e ti permetteranno di modificarla o restituire qualcosa di diverso.
WordPress esegue molti hook, ma puoi crearne uno tuo nel tuo plugin o tema. Ciò consente agli sviluppatori di estendere e modificare il codice; ad esempio modificando un plug-in tramite un tema o modificando il tema principale tramite il tema figlio.
Molte delle funzioni di WordPress, generalmente utilizzate per stampare i post, sono anche filtri o azioni. Ad esempio la funzione the_title()stampa il titolo del post, ma è anche un filtro.
Diamo un’occhiata a come ci agganciamo a questi in pratica.
Agganciarsi alle azioni
Per agganciare un’azione, usi il metodo add_action(). Come minimo richiede due parametri; il nome dell’hook e la richiamata; il nome della funzione che si desidera eseguire. Facoltativamente puoi fornire la priorità come terzo parametro e definire il numero di argomenti che verranno passati alla tua funzione di callback. Esamineremo i due parametri opzionali in seguito, ma per ora, ecco un esempio di add_action:
add_action('init', 'my_function_name');
function my_function_name() {
// Do your stuff
}
Il primo parametro to add_actionè il nome dell’azione; in questo caso init, che è un hook di WordPress piuttosto comune che si verifica durante l’inizializzazione. Il secondo parametro è la tua callback, in questo caso il nome della funzione che desideriamo eseguire. Quindi tutto ciò che devi fare è definire una funzione con quel nome e aggiungere il tuo codice al suo interno.
Puoi anche usare funzioni anonime che è dove definisci la funzione all’interno add_actioninvece di fornire un nome di funzione, in questo modo;
add_action('init', function() {
// Do your stuff
});
Molti sviluppatori preferiscono questo metodo in quanto impedisce il rischio di ridefinire una funzione PHP con lo stesso nome.
Se devi eseguire una funzione definita all’interno di una classe PHP, devi fornire un array come parametro di callback; dove il primo elemento è l’oggetto classe e il secondo elemento è il nome della funzione:
class MyClass {
public function __construct() {
add_action('init', [$this, 'myFunctionName']);
}
public function myFunctionName() {
// Do your stuff
}
}
Aggancio ai filtri
Per agganciare un filtro si usa la funzione add_filter(). Analogamente alle azioni precedenti, il primo parametro è il nome del filtro e il secondo è la richiamata. Facoltativamente puoi fornire la priorità come terzo parametro e il numero di argomenti come quarto. Ecco un esempio di add_filter:
add_filter('the_title', 'my_function_name');
function my_function_name($title) {
// Do your stuff
return $title;
}
Nell’esempio sopra ci colleghiamo al filtro the_title(che stampa il titolo del post) e diciamo a WordPress di eseguire la nostra funzione. Tutti i filtri forniranno sempre un argomento; la variabile da modificare. Nella mia funzione l’ho chiamato perché $titleso che contiene il titolo del post. All’interno della funzione posso modificarla o sovrascrivere completamente la variabile. È importante ricordare che nei filtri devi sempre restituire la variabile. Se non restituisci qualcosa nella tua funzione di callback, la variabile si svuota. Se ho saltato la dichiarazione di ritorno nell’esempio sopra, nessun titolo dei post riecheggia mai da nessuna parte.
L’argomento variabile e la regola di restituire qualcosa nella tua funzione di callback è praticamente l’unica differenza tra filtri e azioni. Tutto il resto funziona allo stesso modo. Puoi seguire gli esempi per le funzioni e le classi anonime mostrate per le azioni sopra per i filtri, così come i parametri facoltativi priorità e numero di argomenti; che vedremo in seguito.
Priorità
Il terzo parametro (facoltativo) per add_actioned add_filterè un numero intero che definisce la priorità della funzione di callback. Questo è utile nei casi in cui ci sono più funzioni (non necessariamente da te nel tuo tema o plugin, ricorda che WordPress stesso usa i suoi hook) e devi decidere quale eseguire per primo.
Se non viene fornita alcuna priorità, il valore predefinito è 10. Minore è la priorità, prima viene eseguita e maggiore è la priorità, più tardi viene eseguita. Non puoi fornire una priorità negativa.
Immagina più funzioni di richiamata registrate in init. Se non è stata fornita alcuna priorità per più richiamate, WordPress le eseguirà nell’ordine in cui sono state trovate (ad esempio nel functions.phpcodice o nel codice del plug-in).
add_action('init', 'my_function_name');
add_action('init', 'my_second_function_name');
add_action('init', 'my_third_function_name', 12);
add_action('init', 'my_fourth_function_name', 1);
Questo sarebbe l’ordine in cui WordPress eseguirà le richiamate di cui sopra:
my_fourth_function_name(priorità 1)my_function_name(priorità 10)my_second_function_name(priorità 10, ma appare più avanti nel codice)my_third_function_name(priorità 12)
Numero di argomenti
Di solito gli hook forniscono alcuni dati aggiuntivi che sono rilevanti e utili per le funzioni di callback. Ad esempio l’azione save_post(viene eseguita ogni volta che un post viene aggiornato) fornisce due possibili argomenti; l’ID del post e l’oggetto del post. Questi sono utili per le operazioni che devi comunemente eseguire su questo hook (ad esempio se vuoi salvare un meta post, hai bisogno dell’ID post).
Se non è stato fornito alcun numero di argomenti per un’azione o un filtro, il valore predefinito è 1. Questo è il motivo per cui non è necessario definire 1 su add_filterper accedere alla variabile a cui è agganciato il filtro. Le azioni, tuttavia, non possono passare argomenti anche se il numero di argomenti è impostato su 1 come predefinito.
Diamo un’occhiata a un esempio di definizione del numero di argomenti e di come accediamo ad essi nella nostra funzione di callback:
add_action('save_post', 'my_function_name', 10, 2);
function my_function_name($post_id, $post) {
// Do your stuff
}
Nell’esempio sopra, diciamo a WordPress di passare due argomenti alla nostra funzione di callback. Ricorda che dobbiamo definire la priorità come terzo parametro, quindi di solito definiamo il valore predefinito, che è 10. Per quanto riguarda la nostra funzione di callback, ora possiamo definire lo stesso numero di argomenti che abbiamo chiesto, nell’esempio sopra era 2.
Se nell’esempio precedente avessimo impostato il numero di argomenti su 1, solo il primo argomento nella nostra funzione di callback sarebbe stato popolato. Il secondo, $post, sarebbe indefinito.
E se avessimo bisogno di dati che non sono stati passati nell’hook?
Spetta interamente allo sviluppatore che ha creato l’hook definire quali argomenti possono essere passati. Ciò significa che non puoi semplicemente forzare gli argomenti che desideri o di cui hai bisogno nel tuo add_actiono add_filter. Fortunatamente nella maggior parte dei casi abbiamo alternative per ottenere le variabili di cui abbiamo bisogno. Se stai agganciando un’azione o un filtro in cui sai che alcune variabili globali dovrebbero essere definite, puoi accedere a queste variabili globali nella tua funzione di callback. Inoltre, WordPress ha un’intera gamma di tag condizionali che puoi utilizzare nelle tue funzioni agganciate (con l’eccezione dei primissimi hook che si verificano prima che WordPress definisca questi tag condizionali)
Diamo un’occhiata a un esempio di accesso a variabili globali. Il filtro the_titlefornisce l’ID del post come argomento opzionale, a cui possiamo accedere definendolo come argomento accettabile;
add_filter('the_title', 'my_function_name', 10, 2);
function my_function_name($title, $post_id) {
if ($post_id == 1) {
return 'First post ever!';
}
return $title;
}
Tuttavia, possiamo ottenere lo stesso risultato;
add_filter('the_title', 'my_function_name');
function my_function_name($title) {
global $post;
if ($post->ID == 1) {
return 'First post ever!';
}
return $title;
}
Se sai che una variabile globale è definita dal punto in cui viene eseguito l’hook, puoi definirla come globale nella tua funzione di callback e accedere ai dati da lì. Ad esempio, la definizione global $wp_querynell’esempio sopra ti darebbe anche accesso all’oggetto wp_query completo all’interno della tua funzione di callback.
I tag condizionali di WordPress sono estremamente utili. A meno che tu non sia agganciato a un hook che si verifica molto presto nell’esecuzione di WordPress, sono disponibili. Ci sono tag condizionali per controllare a quale pagina (modello) ti trovi, se ti trovi all’interno di un menu o di un ciclo di post e molto altro. Ad esempio, quando si modifica la query del post utilizzando l’hook pre_get_posts, è molto utile assicurarsi che il codice venga eseguito solo in determinati casi. Per esempio;
add_action('pre_get_posts', 'my_function_name');
function my_function_name($query) {
if (!is_admin()) {
// Do your stuff
}
}
Poiché l’hook pre_get_postsviene eseguito sia in admin che in frontend, possiamo utilizzare un tag condizionale per garantire che il nostro codice influisca solo sulla query frontend.
Creare i tuoi ganci
È possibile definire le proprie azioni e filtri. Se sei uno sviluppatore di temi o plugin, sei incoraggiato a farlo, in modo da consentire ad altri di modificare il tuo codice senza cambiare il codice sorgente.
Registra un’azione con do_action()e registra un filtro con apply_filters().
Il do_action()richiede un minimo di 1 parametro; il nome del gancio. Tieni presente che il nome dell’hook deve essere univoco (non chiamarlo ad esempio initperché si tratta di un hook principale di WordPress). Posiziona il do_action()punto dove vuoi che appaia il gancio. Ad esempio, puoi posizionare l’hook nel tuo tema header.php, subito dopo il corpo per definire un hook in cui gli sviluppatori possono produrre script o altro contenuto.
...
<body>
<?php do_action('mytheme_after_body'); ?>
Puoi aggiungere tutti i parametri do_actionche vuoi dopo il nome dell’hook. Cerca di tenere a mente ciò di cui gli sviluppatori di dati avrebbero bisogno nei tuoi hook, che altrimenti non sarebbero facilmente accessibili.
Il apply_filters()richiede un minimo di 2 parametri; il nome dell’hook e la variabile su cui stai registrando il filtro. Ad esempio, il tuo tema può registrare un filtro attorno ad alcune classi HTML per consentire agli sviluppatori di modificarle o aggiungerle:
<section class="<?php echo apply_filters('mytheme_section_classes', 'section default-class'); ?>">
...
</section>
Come per le azioni, puoi aggiungere tutti i parametri apply_filtersche desideri dopo i due parametri obbligatori.
Conclusione e risorse utili
Con questo spero che tu abbia raggiunto una solida comprensione di come WordPress esegue la maggior parte del suo codice, come puoi modificare il codice e come tu come sviluppatore puoi consentire anche ad altri sviluppatori di apportare modifiche al tuo codice.