Differenza tra add_filter e apply_filters
Ho cercato una spiegazione adeguata della differenza tra add_filter()
e apply_filters()
qui ma non sono riuscito a trovarne una.
Qualcuno può spiegarmi quali informazioni o logica considerare prima di utilizzare add_filter
o apply_filters
in un determinato contesto.
Cosa rende l'uso di uno imperativo e non dell'altro?
È corretto che
add_filter
aggiunge semplicemente una funzione alla coda delle funzioni in attesa di essere eseguite su una variabile eapply_filters
esegue le funzioni in ordine?È anche corretto che
apply_filters
quando viene chiamato con un argomento (il nome della funzione da eseguire) eseguirà quella funzione prima di tutte le altre (se esistono) nella coda?

La maggior parte di quanto segue può essere trovato nel Codex:
apply_filters
Le funzioni di callback collegate all'hook del filtro
$tag
vengono invocate chiamando questa funzione. Questa funzione può essere utilizzata per creare un nuovo hook di filtro semplicemente chiamando questa funzione con il nome del nuovo hook specificato utilizzando il parametro $tag.
$value = apply_filters( $tag, $value, $var_1, $var_2, ... );
In sostanza:
Si utilizza apply_filters
per filtrare un dato $value
- rispetto al valore stesso e, opzionalmente, alle variabili fornite $var_1
fino a $var_n
.
add_filter
Collega una funzione a una specifica azione di filtro.
add_filter( $tag, $function_to_add, $priority, $accepted_args );
In sostanza:
Si utilizza add_filter
per collegare una funzione personalizzata all'azione di filtro specificata ($tag
), che potrebbe essere stata generata da apply_filters
in precedenza (o potrebbe essere un'azione di filtro integrata o provenire da un plugin/il tuo tema).
Ecco un esempio fittizio:
function print_initials( $name ) {
if ( ! is_string( $name ) ) {
return;
}
$fragments = explode( ' ', $name );
/**
* Filtra se stampare le iniziali in ordine inverso.
*
* @param bool $reverse Stampare le iniziali in ordine inverso?
*/
if ( apply_filters( 'reverse_initials', FALSE ) ) {
$fragments = array_reverse( $fragments );
}
foreach ( $fragments as $f ) {
echo substr( $f, 0, 1 );
}
}
print_initials( 'Some Guy' ); // output: SG
add_filter( 'reverse_initials', '__return_true' );
print_initials( 'Some Guy' ); // output: GS
Ora, se chiamiamo la nostra funzione così com'è, le iniziali vengono stampate da sinistra a destra—perché questo è il comportamento predefinito che abbiamo definito.
La seconda volta, otteniamo le iniziali in ordine inverso—perché la funzione di filtro __return_true
, collegata alla nostra azione di filtro, restituisce sempre TRUE
e quindi fa sì che le iniziali vengano stampate da destra a sinistra.

L'esempio sopra è il classico esempio che manda in confusione un nuovo sviluppatore..
Spiegato in modo rozzo ma comprensibile, puoi usare apply_filters
per creare un filtro personalizzato specifico che potrai poi modificare tramite add_filter
.
D'altra parte, se usi un hook già esistente, puoi usare direttamente add_filter
..
La logica è la tipica non-logica dello sviluppo, quindi devi guardare più esempi e fare pratica per "capire" come funzionano..
So che anche la mia spiegazione potrebbe non essere totalmente chiara (e molti dei nostri colleghi potrebbero uccidermi per l'inesattezza), ma mi sembra la spiegazione più comprensibile che abbia trovato su Internet..

Questa risposta non risponde alla domanda. Una volta che avrai abbastanza reputazione potrai commentare qualsiasi post; invece, fornisci risposte che non richiedano chiarimenti da parte di chi ha fatto la domanda. - Da Review
