Differenza tra filtro e ganci di azione?


51

Ho esaminato l'API del plugin un po 'più in profondità di recente e mi chiedevo quali fossero le reali differenze tra azione e hook di filtro . Entrambi sono eventi che ricevono dati come parametro e sembrano entrambi in grado di fare le stesse cose.

Ovviamente vedo che le azioni vengono chiamate quando si verificano azioni e i filtri quando vengono manipolati i dati, ma sembra essere solo una differenza di denominazione semantica.

Oltre alla semantica ea cosa servono, quali sono le differenze reali tra loro?

Risposte:


58

Ciao @Sruly :

Hai praticamente risposto alla tua domanda, ma elaborerò un po '.

Ganci di azione

Gli hook di azioni sono destinati all'uso quando il core di WordPress o alcuni plugin o temi ti danno l'opportunità di inserire il tuo codice in un determinato punto ed eseguire una o più delle seguenti operazioni:

  1. Utilizzare echoper iniettare un po 'di HTML o altri contenuti nel buffer di risposta,
  2. Modifica lo stato della variabile globale per una o più variabili e / o
  3. Modifica i parametri passati alla tua funzione hook (supponendo che l'hook sia stato chiamato do_action_ref_array()invece che do_action()poiché quest'ultimo non supporta il passaggio di variabili per riferimento ).

Ganci per filtro

I hook di filtro si comportano in modo molto simile agli hook di azione, ma l'uso previsto è quello di ricevere un valore e potenzialmente restituire una versione modificata del valore. Un hook di filtro potrebbe anche essere usato come un hook di azione, ad esempio per modificare una variabile globale o generare un po 'di HTML, supponendo che sia quello che devi fare quando viene chiamato l'hook. Una cosa che è molto importante riguardo a Hook di filtro di cui non devi preoccuparti con Action Hook è che la persona che utilizza un Hook di filtro deve restituire (una versione modificata di) il primo parametro che è stato passato. Un errore da principiante comune è dimenticare di restituire quel valore!

Utilizzo di parametri aggiuntivi per fornire il contesto negli hook filtro

Per inciso, ho sentito che Filter Hooks era un ostacolo nelle versioni precedenti di WordPress perché avrebbero ricevuto solo un parametro; cioè otterrebbero un valore da modificare ma nessun secondo o terzo parametro per fornire qualsiasi contesto. Ultimamente, e comunque positivamente, sembra che il core team di WordPress abbia gioiosamente (per me) aggiunto parametri aggiuntivi a Filter Hooks in modo da poter scoprire più contesto. Un buon esempio è il posts_wheregancio; Credo che alcune versioni precedenti accettassero solo un parametro essendo la classe "where" della query corrente, ma ora accetta sia la clausola where sia un riferimento all'istanza corrente della WP_Queryclasse che sta invocando l'hook.

Qual è la vera differenza?

In realtà Filter Hooks sono praticamente un superset di Action Hook. Il primo può fare tutto ciò che può fare il secondo e un po 'di più, anche se lo sviluppatore non ha la responsabilità di restituire un valore con il gancio di azione che fa con il gancio di filtro.

Dare orientamento e intento di telegrafare

Ma questo non è probabilmente ciò che è importante. Penso che ciò che è importante sia che uno sviluppatore che scelga di usare un hook di azione rispetto a un hook di filtro o viceversa stia telegrafando le proprie intenzioni e fornendo così una guida allo sviluppatore di temi o plug-in che potrebbe utilizzare l'hook. In sostanza stanno dicendo: "Sto per chiamarti, fai tutto quello che devi fare" O "Ho intenzione di passarti questo valore per modificarlo, ma assicurati di passarlo indietro ."

Quindi alla fine penso che la guida fornita dalla scelta del tipo di gancio sia il vero valore alla base della distinzione . IMO, comunque.

Spero che sia di aiuto!


Per me sembra che avresti potuto usare i filtri per tutto, dal momento che la restituzione di una variabile è facoltativa in PHP. Qualcuno sa perché gli sviluppatori di WordPress hanno scelto di avere due termini separati? È puramente per ragioni semantiche? Tecnicamente non riesco a vederne la necessità ...
TheStoryCoder il

2
@TheStoryCoder "È solo per motivi semantici?" Sembra che sia esattamente quello che ha spiegato la mia risposta, cinque (5) anni fa ...?
MikeSchinkel,

11

Se guardi alla fonte per la add_action()funzione principale, è solo un wrapper per la add_filter()funzione ...

E se osservi la do_action()funzione principale, è molto simile alla apply_filters()funzione principale, con una differenza fondamentale: non restituisce un valore.

Che cosa significa questo? le azioni sono come i filtri, tranne per il fatto che un'azione non restituisce un valore, quindi non è possibile modificare i dati. Mostra che era semplice creare il meccanismo di azione di WordPress semplicemente copiando il meccanismo di filtro e non restituendo un valore. Fondamentalmente, tutto ciò che puoi fare con un'azione è semplicemente eseguire una funzione senza modificare alcun valore.


5

In parole semplici.

Le azioni sono quelle funzioni PHP che eseguono l'output.

I filtri sono quelle funzioni PHP che restituiscono l'output.

Aggiornato: possiamo estendere qualsiasi plug-in che utilizza le azioni e i filtri senza modificare il codice lì. Aggiungendo filtri e azioni nel nostro tema o plugin.


Come usare?

Azione:

Controlla di seguito semplici esempi nel functions.phpfile del tema .

  1. Esempio 1: (esempio PHP semplice)
test di funzionalita() {
     echo "Output";
}

test();

Sopra il programma stampare l'output:

Produzione

[NOTA: qui test () chiama semplicemente la funzione. Ed esegui la funzione di callback 'test'.]


  1. Esempio due: (uso semplice dell'azione)
funzione test1 () {
     echo "Output";
}
add_action ('test', 'test1');

do_action ('test');

Sopra il programma stampare l'output:

Produzione

[NOTA: qui do_action('test')funziona come la funzione di chiamata. Ed esegui la funzione di callback 'test1'.]


  1. Esempio tre: (Un altro uso delle azioni)
funzione test2 () {
     echo "Test 2";
}
add_action ('test', 'test2', 1);

funzione test1 () {
     echo "Test 1";
}
add_action ('test', 'test1', 2);

do_action ('test');

Sopra il programma stampare l'output:

Test 2 Test 1

[NOTA: qui do_action('test')funziona come la funzione di chiamata. Ed esegui le funzioni di callback sulle sue priorità.

La funzione di callback 'test1' ha la priorità 2 E 'test2' ha la priorità 1.]

Se le priorità cambiano come 'test1' con priorità 1 E 'test2' con priorità 2, l'output sarà:

Test 1 Test 2

  1. Esempio quattro: (supporto di terze parti) Aggiungi sotto il codice infunctions.php
funzione test1 () {
     do_action ('test_before');
     echo "Test 1";
     do_action ('test_after');
}
add_action ('test', 'test1');

do_action ('test');

Sopra il programma stampare l'output:

Test 1

Ora, crea un plug-in di esempio per verificare come funziona per gli sviluppatori di terze parti.

  1. Crea una cartella "semplice" nella /wp-content/plugins/directory.
  2. Crea il file chiamato "simple.php" e aggiungi il codice qui sotto.
/ *
* Nome plug-in: Plugin semplice
* /
funzione test_callback_function () {
     echo "Dal plug-in";
}
add_action ('test', 'test_callback_function');

Ora, attiva il nostro plugin semplice dalla dashboard di amministrazione di WordPress.

Vai al plugin del menu e attivalo.

Dopo aver attivato il plugin sopra il programma, stampare l'output:

Test 1 Dal plug-in

[NOTA: se aggiungiamo la priorità per la nostra azione plugin da 1 a 9, stampa l'output come:

Da pluginTest 1

Perché, WordPress considera il 10 priority by defaultper tutte le azioni aggiunte.]

filtri

Controlla gli esempi seguenti:

Esempio semplice di PHP:

$ data = array ('one', 'two');
print_r ($ data);

Sopra il programma stampare l'output:

Array ([0] => one [1] => two)
  1. Esempio 1: (uso semplice del filtro)
$ data = apply_filters ('my_filter_name', array ('one', 'two'));
print_r ($ data);

add_filter ('my_filter_name', function ($ old_data) {
     matrice di ritorno ('tre', 'quattro');
});

Sopra il programma stampare l'output:

Matrice ([0] => tre [1] => quattro)

Qui, abbiamo aggiunto il filtro my_filter_namee modificato l'output esistente array( 'one', 'two' )con array( 'three', 'four' )senza cambiare i file tema / plugin.



Grazie @maheshwaghmare per un trucco così semplice. per favore scrivi anche su "Filtri"
Adi,

Cosa intendi esattamente con "presto"?
Rapti,

@Rapti Ci scusiamo per il ritardo. Stasera aggiungerò la risposta relativa ai filtri. In futuro creerò un articolo descrittivo relativo agli hook (azioni e filtri).
Maheshwaghmare,

@maheshwaghmare procrastinare molto? : P

Buona spiegazione, ora ho una comprensione migliore
budiantoip,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.