Differenza tra Filter e Action Hooks in WordPress
Ho esaminato più approfonditamente l'API dei plugin di recente e mi stavo chiedendo quali fossero le reali differenze tra gli action e i filter hooks. Entrambi sono eventi che ricevono dati come parametro e sembrano poter fare le stesse cose.
Ovviamente noto che le actions vengono chiamate quando si verificano delle azioni e i filters vengono chiamati quando i dati vengono manipolati, ma sembra essere solo una differenza semantica nella denominazione.
Oltre alla semantica e al loro utilizzo specifico, quali sono le reali differenze tra di loro?

Ciao @Sruly:
Hai praticamente già risposto da solo alla tua domanda, ma approfondirò un po'.
Action Hooks
Gli Action Hooks sono pensati per essere utilizzati quando il core di WordPress, un plugin o un tema ti dà l'opportunità di inserire il tuo codice in un determinato punto e fare una o più delle seguenti operazioni:
- Usare
echo
per iniettare del codice HTML o altro contenuto nel buffer di risposta, - Modificare lo stato di una variabile globale per una o più variabili, e/o
- Modificare i parametri passati alla tua funzione hook (assumendo che l'hook sia stato chiamato con
do_action_ref_array()
invece dido_action()
, dato che quest'ultimo non supporta il passaggio di variabili by-reference.)
Filter Hooks
I Filter Hooks si comportano in modo molto simile agli Action Hooks, ma il loro scopo principale è ricevere un valore e potenzialmente restituirne una versione modificata. Un filter hook potrebbe anche essere usato proprio come un Action Hook, cioè per modificare una variabile globale o generare del codice HTML, assumendo che sia ciò di cui hai bisogno quando l'hook viene chiamato. Una cosa molto importante dei Filter Hooks, che non devi preoccuparti di fare con gli Action Hooks, è che chi usa un Filter Hook deve restituire (una versione modificata di) il primo parametro che gli è stato passato. Un errore comune dei principianti è dimenticare di restituire quel valore!
Utilizzare Parametri Aggiuntivi per Fornire Contesto nei Filter Hooks
Tra parentesi, ho sempre pensato che i Filter Hooks fossero limitati nelle prime versioni di WordPress perché ricevevano solo un parametro; cioè ottenevano un valore da modificare ma nessun secondo o terzo parametro per fornire contesto. Ultimamente, però, e in modo positivo, sembra che il team del core di WordPress abbia gioiosamente (per me) iniziato ad aggiungere parametri extra ai Filter Hooks in modo da poter scoprire più contesto. Un buon esempio è l'hook posts_where
; credo che qualche versione fa accettasse solo un parametro, cioè la clausola SQL "where" della query corrente, ma ora accetta sia la clausola where che un riferimento all'istanza corrente della classe WP_Query
che sta richiamando l'hook.
Quindi Qual è la Vera Differenza?
In realtà, i Filter Hooks sono praticamente un superset degli Action Hooks. I primi possono fare tutto ciò che fanno i secondi e qualcosa in più, anche se lo sviluppatore non ha la responsabilità di restituire un valore con l'Action Hook come invece ha con il Filter Hook.
Fornire Guida e Comunicare l'Intento
Ma probabilmente non è questo ciò che conta. Penso che ciò che sia importante è che, scegliendo di usare un Action Hook invece di un Filter Hook o viceversa, uno sviluppatore sta comunicando il suo intento e quindi fornendo una guida al themer o allo sviluppatore di plugin che potrebbe usare l'hook. In sostanza, sta dicendo "Ti chiamerò, fai ciò che devi fare" OPPURE "Ti passerò questo valore da modificare, ma assicurati di restituirlo".
Quindi, in definitiva, penso che la guida fornita dalla scelta del tipo di hook sia il vero valore dietro questa distinzione. Secondo me, almeno.
Spero che questo ti sia utile!

A me sembra che avresti potuto usare semplicemente i filtri per tutto, dato che restituire una variabile è opzionale in PHP. Qualcuno sa perché gli sviluppatori di WordPress hanno scelto di avere due termini separati? È puramente per ragioni semantiche? Tecnicamente non vedo la necessità...

@TheStoryCoder "È puramente per ragioni semantiche?" Sembra che sia esattamente ciò che la mia risposta ha spiegato, cinque (5) anni fa...?

Sono davvero contento di aver trovato sia questa domanda che questa risposta. Sono sicuro che la maggior parte di chi ha votato positivamente rifletta come me sul fatto che siano essenzialmente la stessa cosa e abbia trovato in questa risposta la conferma e la spiegazione delle sottigliezze in modo soddisfacentemente chiarificatore.

Se osservi il codice sorgente della funzione core add_action()
, vedrai che è semplicemente un wrapper per la funzione add_filter()
...
E se esamini la funzione core do_action()
, noterai che è molto simile alla funzione core apply_filters()
, con una differenza fondamentale: non restituisce alcun valore.
Cosa significa questo? Le azioni (actions) sono simili ai filtri (filters), con la differenza che un'azione non restituisce un valore, quindi non puoi modificare i dati. Questo dimostra che è stato semplice creare il meccanismo delle azioni in WordPress semplicemente copiando il meccanismo dei filtri e omettendo il valore di ritorno. In sostanza, tutto ciò che puoi fare con un'azione è eseguire una funzione senza modificare alcun valore.

In parole semplici.
Azioni sono quelle funzioni PHP che eseguono l'output.
Filtri sono quelle funzioni PHP che restituiscono l'output.
Aggiornamento: Possiamo estendere qualsiasi plugin che utilizza azioni e filtri senza modificare il loro codice. Aggiungendo filtri e azioni nel nostro tema o plugin.
Come utilizzarli?
Azioni:
Controlla i semplici esempi qui sotto nel file functions.php
del tuo tema.
- Esempio Uno: (Semplice esempio PHP)
function test() { echo "Output"; } test();
Il programma sopra stampa l'output:
Output
[NOTA: Qui test() semplicemente chiama la funzione. E esegue la funzione di callback 'test'.]
- Esempio Due: (Semplice utilizzo di un'Azione)
function test1() { echo "Output"; } add_action( 'test', 'test1' ); do_action( 'test' );
Il programma sopra stampa l'output:
Output
[NOTA: Qui do_action('test')
funziona come una chiamata a funzione. E esegue la funzione di callback 'test1'.]
- Esempio Tre: (Un altro utilizzo delle Azioni)
function test2() { echo "Test 2"; } add_action( 'test', 'test2', 1 ); function test1() { echo "Test 1"; } add_action( 'test', 'test1', 2 ); do_action( 'test' );
Il programma sopra stampa l'output:
Test 2Test 1
[NOTA: Qui do_action('test')
funziona come una chiamata a funzione. E esegue le funzioni di callback in base alle loro priorità.
La funzione di callback 'test1' ha priorità 2 e 'test2' ha priorità 1.]
Se le priorità vengono cambiate, ad esempio 'test1' con priorità 1 e 'test2' con priorità 2, l'output sarà:
Test 1Test 2
- Esempio Quattro: (Supporto per terze parti)
Aggiungi il codice qui sotto in
functions.php
function test1() { do_action( 'test_before' ); echo "Test 1"; do_action( 'test_after' ); } add_action( 'test', 'test1' ); do_action( 'test' );
Il programma sopra stampa l'output:
Test 1
Ora, crea un plugin di esempio per verificare come funziona per gli Sviluppatori di terze parti.
- Crea una cartella 'simple' nella directory
/wp-content/plugins/
. - Crea un file chiamato 'simple.php' e aggiungi il codice qui sotto.
/* * Plugin Name: Simple Plugin */ function test_callback_function() { echo "Dal plugin"; } add_action( 'test', 'test_callback_function' );
Ora, attiva il nostro Simple plugin dalla dashboard di amministrazione di WordPress.
Vai al menu plugin e attivalo.
Dopo aver attivato il plugin, il programma sopra stamperà l'output:
Test 1Dal plugin
[NOTA: Se aggiungiamo la priorità per l'azione del nostro plugin da 1 a 9, stamperà l'output come:
Dal pluginTest 1
Perché WordPress considera priorità 10 come predefinita
per tutte le azioni aggiunte.]
Filtri
Controlla gli esempi qui sotto:
Semplice esempio PHP:
$data = array( 'one', 'two' ); print_r( $data );
Il programma sopra stampa l'output:
Array ( [0] => one [1] => two )
- Esempio Uno: (Semplice utilizzo di un Filtro)
$data = apply_filters( 'my_filter_name', array( 'one', 'two' ) ); print_r( $data ); add_filter( 'my_filter_name', function( $old_data ) { return array( 'three', 'four' ); });
Il programma sopra stampa l'output:
Array ( [0] => three [1] => four )
Qui, abbiamo aggiunto il filtro my_filter_name
e modificato l'output esistente array( 'one', 'two' )
con array( 'three', 'four' )
senza cambiare i file del tema/plugin.

Grazie @maheshwaghmare per questo trucco così semplice. Per favore, scrivi anche riguardo ai 'Filtri'

@Rapti Scusa per il ritardo. Stasera aggiungerò la risposta relativa ai filtri. In futuro creerò un articolo descrittivo riguardo agli Hook (Azioni e Filtri).

Perché non chiamare i metodi direttamente e perché non filtrare i dati direttamente dove servono? Qual è il vero scopo dei metodi do_action, add_action e apply_filters?

La principale differenza tra un'azione e un filtro può essere riassunta così:
- un'azione prende le informazioni che riceve, fa qualcosa con esse e non restituisce nulla. In altre parole: agisce su qualcosa e poi termina, senza restituire nulla all'hook chiamante.
- un filtro prende le informazioni che riceve, le modifica in qualche modo e le restituisce. In altre parole: filtra qualcosa e lo passa nuovamente all'hook per un ulteriore utilizzo.
Per dirla in un altro modo:
- un'azione interrompe il flusso del codice per fare qualcosa, poi torna al flusso normale senza modificare nulla;
- un filtro viene utilizzato per modificare qualcosa in modo specifico, affinché la modifica venga poi utilizzata dal codice successivo.
Il qualcosa a cui ci si riferisce è la lista di parametri inviata tramite la definizione dell'hook.
