Differenza tra add_filter e apply_filters


17

Ho cercato una spiegazione adeguata della differenza tra add_filter()e apply_filters()qui ma non sono riuscito a trovarne una.

Qualcuno può dirmi quali informazioni o logica considerare prima di utilizzare add_filtero apply_filtersin un contesto.

Ciò rende l'uso di un imperativo e non dell'altro?

  • È corretto add_filteraggiungere una funzione alla coda di funzioni in attesa di essere eseguita su una variabile ed apply_filterseseguire le funzioni in ordine?

  • È anche corretto che apply_filtersquando viene chiamato con un argomento (il nome della funzione da eseguire) eseguirà quella funzione prima di tutte le altre (se presenti) nella coda?


2
Che dire della documentazione esistente qui e qui non la spiega adeguatamente per te?
t31os,

3
Penso che questa sia in realtà una buona domanda. Come nuovo sviluppatore di wordpress questo può essere un concetto confuso.
Shawn,

Risposte:


26

La maggior parte delle seguenti informazioni è disponibile nel Codice :


apply_filters

Le funzioni di callback associate all'hook del filtro $tagvengono 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_filtersper filtrare un dato $value, rispetto al valore stesso e anche $var_1tramite le variabili fornite facoltativamente $var_n.


add_filter

Agganciare una funzione a un'azione di filtro specifica.

add_filter( $tag, $function_to_add, $priority, $accepted_args );

In sostanza:
si utilizza add_filterper agganciare una funzione personalizzata all'azione filtro specificata ( $tag), che potrebbe essere stata generata in apply_filtersprecedenza (o era un'azione filtro incorporata o deriva da un plugin / tema).


Quindi, ecco un esempio immaginario :

function print_initials( $name ) {

    if ( ! is_string( $name ) ) {
        return;
    }

    $fragments = explode( ' ', $name );

    /**
     * Filter wether to print initials in reverse order.
     *
     * @param bool $reverse Print initials in reverse order?
     */
    if ( apply_filters( 'reverse_initials', FALSE ) ) {
        $fragments = array_reverse( $fragments );
    }

    foreach ( $fragments as $f ) {
        echo substr( $f, 0, 1 );
    }
}

print_initials( 'Some Guy' ); // outputs: SG

add_filter( 'reverse_initials', '__return_true' );

print_initials( 'Some Guy' ); // outputs: GS

Ora, se chiamiamo semplicemente la nostra funzione così com'è, le iniziali vengono stampate da sinistra a destra, perché questo è ciò che abbiamo definito comportamento predefinito.

La seconda volta, otteniamo le iniziali in ordine inverso, perché la funzione filtro __return_true, che è agganciata alla nostra azione filtro, ritorna sempre TRUEe quindi le iniziali vengono emesse da destra a sinistra.


3
Questa è un'ottima risposta e mostra come è possibile ignorare i filtri. Grazie.
Shawn,
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.