Differenza tra add_filter e apply_filters

30 gen 2014, 12:52:11
Visualizzazioni: 34.8K
Voti: 25

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 e apply_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?

3
Commenti

Cosa c'è nella documentazione esistente qui e qui che non ti spiega adeguatamente il concetto?

t31os t31os
30 gen 2014 13:01:40

Penso che questa sia effettivamente una buona domanda. Come nuovo sviluppatore WordPress, questo può essere un concetto confuso.

Shawn Shawn
29 set 2014 21:00:59

Tutti siamo stati principianti una volta.

Scott C Wilson Scott C Wilson
6 ott 2024 19:21:33
Tutte le risposte alla domanda 2
1
33

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.

30 gen 2014 13:03:54
Commenti

Questa è un'ottima risposta e mostra come è possibile sovrascrivere i filtri. Grazie.

Shawn Shawn
29 set 2014 21:01:47
1

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..

23 apr 2023 10:25:11
Commenti

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

cjbj cjbj
26 apr 2023 12:25:48