Azioni e filtri WordPress qual è la differenza?

I ganci di azione e filtro sono una parte fondamentale delle varie API di WordPress. Senza di loro sei limitato a ciò che puoi fare nei tuoi temi e (specialmente) nei tuoi plugin.

Ma a volte può essere facile confondere i due, specialmente nei casi in cui WordPress ha sia un hook di azione che un hook di filtro con lo stesso nome.

In questo articolo definirò action e filtri hook e descriverò la differenza tra loro, e dimostrerò come usarli nei tuoi temi e plugin. Darò anche alcuni esempi di quando potresti usarli.

Quando si aggiungono azioni e si agganciano i filtri al codice (o si agganciano funzioni ad essi), è utile capire come vengono chiamate azioni e filtri da WordPress e cosa succede in quale ordine. Non ne parlerò in dettaglio qui, perché abbiamo un altro tutorial che fa quel lavoro.

Definizioni e differenze

Iniziamo con alcune definizioni. Definirò l'azione e filtrerò anche i ganci e le funzioni, in modo che tu possa vedere la differenza tra tutti.

funzioni

Le funzioni sono la prima cosa in cui la maggior parte delle persone lavora quando stanno imparando lo sviluppo di WordPress; se hai aggiunto del codice al tuo tema functions.php file, quindi avrai scritto una funzione.

Le funzioni specificano come succederà qualcosa. Si codifica una funzione per interrogare i dati, emettere il contenuto o eseguire molte altre attività. Puoi chiamare (eseguire) le funzioni direttamente nei file modello del tuo tema, oppure puoi agganciarle all'azione o filtrare i ganci. Le funzioni possono anche includere tag modello come tag condizionali, per specificare quando la funzione deve essere applicata.

Ti mostrerò i diversi modi per eseguire le funzioni più avanti in questo articolo.

Ganci d'azione

I ganci (o le azioni) di azione vengono attivati ​​quando si verifica qualcosa, ad esempio il caricamento di una pagina, l'accesso di un utente o un'azione personalizzata definita nel tema o nel plug-in.

Puoi aggiungere i tuoi ganci di azione usando il do_action () funzione, che dimostrerò a breve. Qualsiasi funzione associata a quell'azione verrà quindi eseguita in quel punto del codice.

Ganci per filtri

Filtra hook o filtri, controlla come succede qualcosa o cambia qualcosa che è già in uscita. È possibile utilizzare un filtro per emettere i metadati in un formato specifico, per sovrascrivere l'output di testo del proprio plug-in o per impedire che venga visualizzato qualcosa.

Aggiungi i filtri nel tuo codice usando il apply_filters () funzione, che dimostrerò a breve. Come indica la parola "applica", si applicano i filtri al codice esistente, mentre un'azione viene creata utilizzando do_action () è vuoto finché non si agganciano le funzioni ad esso.

Utilizzo di funzioni, azioni e filtri

Diamo un'occhiata ad alcuni esempi che dimostrano come si utilizzano ciascuna delle funzioni, azioni e filtri. Innanzitutto, esamineremo le funzioni direttamente nel codice senza collegarle a un hook.

Chiamare direttamente le funzioni

Ecco un esempio di una funzione che viene chiamata direttamente in un file di modello. Nei miei siti cliente aggiungo un colophon nel footer, che include le informazioni sul copyright. Ecco la funzione:

if (! function_exists ('compass_colophon')) function compass_colophon () ?> 
"title =""rel =" home "> Basato su WordPress e progettato da Compass Design.

Questa funzione è collegabile quando la utilizzo in un tema principale; se poi creo una nuova funzione con lo stesso nome nel mio tema figlio, questo sovrascriverà questa funzione. Si noti che la funzione include un'altra funzione, compass_colophon (), chiamandolo direttamente nel codice.

Questa funzione è nel functions.php file del tema principale. Posso chiamarlo direttamente nel footer.php file del mio tema, in questo modo:

compass_colophon ();

Questo produce il codice nella funzione nel punto nel mio tema in cui lo chiamo. È inoltre possibile passare parametri alle funzioni, che vengono quindi utilizzate all'interno della funzione.

Come dimostrerò a breve, questa funzione potrebbe anche essere agganciata a un'azione oa un filtro.

Agganciare le funzioni alle azioni

Piuttosto che chiamare direttamente la funzione colophon, avrò più flessibilità se la allego ad un gancio.

Creazione di ganci di azione

Invece di chiamare il compass_colophon () funzione nel mio file footer, posso aggiungere un hook di azione in quel punto nel file footer.php file, aggiungendo questo:

do_action ('compass_in_footer');

Il do_action () la funzione ha un parametro obbligatorio, che è il nome dell'azione. Puoi anche facoltativamente aggiungere argomenti ad esso.

Agganciare le funzioni alle azioni

Così ora invece di chiamare la mia funzione colophon, ho bisogno di collegarlo al mio nuovo hook di azione. Nel mio functions.php file, aggiungo questo con la mia funzione:

add_action ('compass_in_footer', 'compass_colophon');

Questo aggancia la mia funzione al compass_in_footer azione, il che significa che il codice all'interno della mia funzione verrà eseguito nel punto nel codice in cui è stata inserita l'azione. Il primo parametro è il nome dell'azione hook e il secondo è il nome della mia funzione.

Un vantaggio di farlo in questo modo è che puoi agganciare più di una funzione alla stessa azione, e puoi impostare la priorità in modo che facciano fuoco nell'ordine in cui vuoi che siano.

Quindi diciamo che ho un'altra funzione che voglio collegare alla mia compass_in_footer gancio, chiamato compass_smallprint (), che contiene qualche piccola stampa in più:

if (! function_exists (compass_smallprint ())) function compass_smallprint () // contenuto della funzione qui add_action ('compass_in_footer', 'compass_smallprint', 20);

Puoi vedere qui che ho aggiunto un terzo parametro al mio add_action () funzione, che è la priorità. La priorità predefinita è 10, che verrà applicato se lasci questo spazio vuoto. Quindi, perché non ho impostato una priorità per il mio compass_colophon () funzione, impostazione 20 per il compass_smallprint () la funzione farà funzionare quella funzione dopo il compass_colophon () funzione.

Sganciare le funzioni dalle azioni

A volte si desidera interrompere l'esecuzione di una funzione e non è possibile sovrascriverla perché non è collegabile. Se la funzione è stata agganciata a un hook di azione, è possibile farlo utilizzando il comando remove_action () funzione.

Quindi se voglio impedire il mio compass_smallprint () funzione dalla corsa, l'ho sganciato dal compass_in_footer azione in questo modo:

remove_action ('compass_in_footer', 'compass_smallprint', 20);

Il remove_action () la funzione ha tre parametri: il nome del hook dell'azione, il nome della funzione e la priorità con cui la funzione era originariamente agganciata all'azione. È necessario includere la priorità affinché funzioni.

È anche possibile sganciare tutte le funzioni da un'azione se si desidera impedire che tutte vengano eseguite. Fai attenzione quando fai questo, in quanto potrebbero esserci delle funzioni che non sei consapevole di essere agganciate alla tua azione.

Per fare questo, utilizzare il remove_all_actions () funzione:

remove_all_actions ('compass_in_footer');

L'aggiunta di un numero di priorità come secondo parametro rimuove solo le funzioni che sono agganciate a quel gancio di azione con la priorità che hai specificato, il che ti dà più controllo.

Agganciare le funzioni ai filtri

Hai anche la possibilità di agganciare le tue funzioni ai ganci filtro. Lo fai quando vuoi modificare o sovrascrivere un codice esistente. Quando si crea il gancio del filtro (usando il apply_filters () funzione), lo si avvolge attorno al codice nel tema o nel plugin, che viene poi modificato da eventuali filtri collegati al gancio.

Questo può essere utile se hai opzioni per il tema o il plug-in che desideri sovrascrivere un'impostazione predefinita o se stai creando un tema principale che può avere elementi sovrascritti da un tema figlio.

Creazione di ganci filtro

Il apply_filters () la funzione ha tre parametri: il nome del hook del filtro, il valore che si desidera filtrare (vale a dire il valore predefinito) e le variabili facoltative che si passano alle funzioni collegate al filtro.

È possibile aggiungere un filtro nei file modello del tema o all'interno di una funzione che è agganciata tramite un hook di azione. Diamo un'occhiata a entrambe le opzioni.

Tornando al mio compass_colophon () funzione, lo converto in un filtro aggiungendo il suo contenuto al mio footer.php file all'interno del apply_filters () funzione in questo modo:

echo apply_filters ('compass_colophon', ' 
"title =""rel =" home "> Basato su WordPress e progettato da Compass Design.
');

Questo produce il codice che ho impostato come secondo parametro del mio apply_filters () funzione.

Tuttavia, preferisco non aggiungerlo direttamente al mio file modello del tema, quindi aggiungerò il filtro alla funzione che sto già collegando tramite un hook di azione.

Quindi aggiungo il compass_in_footer azione per il mio footer.php file usando il do_action () funzione come dimostrato sopra, e quindi creo una funzione nel mio functions.php file che è agganciato a quell'azione e contiene un filtro:

if (! function_exists ('compass_colophon')) function compass_colophon () echo apply_filters ('compass_colophon_filter', ' 
"title =""rel =" home "> Basato su WordPress e progettato da Compass Design.
'); add_action ('compass_in_footer', 'compass_colophon');

Ciò significa che ora posso sovrascrivere il contenuto predefinito in uno dei tre modi seguenti:

  • creando una nuova funzione chiamata compass_colophon () nel mio tema figlio, che sovrascrive la funzione nel mio tema principale in quanto è collegabile
  • sganciando il compass_colophon () funzione dal compass_in_footer azione agganciare e scrivere una nuova funzione che io lego ad esso al suo posto
  • creando una nuova funzione che poi agganci al compass_colophon_filter filtro hook, che sostituisce il valore nel mio apply_filters () funzione

Nella vita reale non avresti bisogno di avere così tante opzioni, quindi è più probabile che tu applichi i filtri a parte del contenuto nella tua funzione piuttosto che l'intera cosa.

Così ho potuto creare due filtri, uno per la sezione copyright e l'altro per i crediti:

if (! function_exists ('compass_colophon')) function compass_colophon () echo '
'; echo apply_filters ('compass_copyright_filter', ' "title =""rel =" home "> '); echo apply_filters ('compass_copyright_filter', ' Basato su WordPress e progettato da Compass Design. '); eco '
'; add_action ('compass_in_footer', 'compass_colophon');

Quindi potrei ignorare l'intera funzione compass_colophon sganciarla o scriverne una nuova nel mio tema figlio, oppure potrei creare una funzione collegata al compass_copyright_filter o compass_credits_filter gancio filtro, per sovrascrivere ogni elemento singolarmente.

Agganciare le funzioni ai filtri

Per agganciare una funzione a un hook di filtro, usi il add_filter () funzione, che ha due parametri: il nome del gancio e il nome della funzione.

Quindi per cambiare i crediti, vorrei scrivere questa funzione:

function new_credits () ?>  Basato su WordPress e progettato da Rachel McCollin.   

Questo sovrascrive il valore impostato nel mio originale compass_credits_filter gancio filtro con il contenuto del mio new_credits () funzione, ma mantiene tutto il resto in compass_colophon () funzionano allo stesso modo.

È anche possibile specificare priorità quando si agganciano le funzioni ai filtri, esattamente nello stesso modo con i ganci di azione. Le funzioni con una priorità più bassa verranno eseguite per prime.

Sganciare le funzioni dai filtri

Come con i ganci di azione, puoi anche rimuovere le funzioni dai ganci filtro. Lo fai usando la funzione remove_filter (), che ha tre parametri: il nome del hook del filtro, il nome della funzione e la priorità, che è obbligatoria se è stata impostata una priorità quando la funzione era originariamente agganciata al filtro.

Quindi per rimuovere il mio new_credits () funzione, io uso questo:

remove_filter ('compass_credits_filter', 'new_credits');

L'output del codice tornerà quindi al valore che ho specificato nel mio originale apply_filters () funzione. Quindi se volessi rimuovere il new_credits () funzione e non avere nulla al suo posto, dovrei aggiungere una nuova funzione. Quindi sgancia la prima funzione e agganci la mia nuova funzione in questo modo:

function no_credits () return;  remove_filter ('compass_credits_filter', 'new_credits'); add_filter ('compass_credits_filter', 'no_credits');

Sommario

Comprendere la differenza tra azione e hook di filtro e poterli utilizzare in modo efficace darà al tuo tema e allo sviluppo di plugin una spinta. In effetti, senza usare ganci di almeno un tipo, non è possibile scrivere plug-in, poiché l'unico modo in cui il codice nei plugin viene attivato è tramite l'azione e i hook del filtro a cui è collegato.

Questa guida ti mostra come aggiungere la stessa funzionalità usando una funzione, un hook di azione e uno o più hook di filtro, insieme a tecniche per rimuovere le funzioni dagli hook e consigli su quando ogni tecnica è più utile.

Oltre alle funzioni di aggancio alla tua azione e ai ganci filtro che crei, puoi collegarli alle azioni e ai filtri forniti da WordPress, ad esempio wp_head azione o il body_class filtro.