Difficoltà a comprendere apply_filters()

26 apr 2013, 17:40:50
Visualizzazioni: 30.2K
Voti: 21

In apply_filters()

apply_filters( $tag, $value, $var ... );

Ho difficoltà a comprendere appieno $value e $var. Ho letto il codex e sembra che $value possa essere modificato, mentre $var no, ma non ho trovato esempi concreti di questo comportamento. Sembra essere utilizzato come un modo per passare una variabile. In tal caso, qual è la differenza tra questo e il $var?

0
Tutte le risposte alla domanda 2
3
36

Prova a vedere la funzione con nomi migliori:

apply_filters(
    $filter_name,     // usato per add_filter( $filter_name, 'callback' );
    $value_to_change, // l'unica variabile il cui valore puoi modificare
    $context_1,       // contesto
    $context_2        // ulteriore contesto
);

Quindi quando quella funzione viene chiamata come:

// wp-login.php riga 94
apply_filters( 'login_body_class', $classes, $action );

Puoi usare...

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );

... e ottenere due variabili passate a quella funzione. Restituisci la prima, la seconda fornisce solo più contesto:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

Le variabili aggiuntive servono per rendere le tue decisioni più facili, non per modificarle anche quelle.

26 apr 2013 17:54:24
Commenti

Se ho capito bene, non devo aggiungere una variabile per raccogliere il valore restituito da apply_filters perché viene applicato automaticamente a $value_to_change?

r00tAcc3ss r00tAcc3ss
26 apr 2013 18:21:13

@r00tAcc3ss Nulla avviene automaticamente. Devi modificare il valore nella tua callback. Puoi anche restituirlo invariato se vuoi - dipende dal contesto.

fuxia fuxia
26 apr 2013 18:33:53

Ah, sì. Intendevo che non devo accettare il valore restituito in un'altra variabile e assegnarlo a $value. Questo viene fatto, se modifico $value nella funzione agganciata e lo restituisco, "automaticamente".

r00tAcc3ss r00tAcc3ss
26 apr 2013 19:17:45
3
14

Cosa sono i Filtri?

I filtri sono funzioni attraverso le quali WordPress fa passare i dati, in determinati momenti dell'esecuzione, appena prima di compiere qualche azione con i dati (come aggiungerli al database o inviarli allo schermo del browser). I filtri si trovano tra il database e il browser (quando WordPress sta generando le pagine), e tra il browser e il database (quando WordPress aggiunge nuovi post e commenti al database); la maggior parte degli input e output in WordPress passa attraverso almeno un filtro. WordPress applica alcuni filtri di default, e il tuo plugin può aggiungere i propri filtri.

Agganciarsi a un Filtro

Per permettere agli utenti di modificare alcuni dati specifici (un valore, l'output di una funzione, ecc.), vengono forniti degli hook di filtro tramite le funzioni apply_filters.
Questi hook di filtro includono il nome (o tag) del filtro e almeno il nome della funzione che deve essere usata per filtrare (cioè alterare in qualche modo) i dati.

Per modificare il titolo di un post, puoi usare l'hook di filtro the_title, definito come segue:

apply_filters( 'the_title', $title, $id );

Questo significa che il filtro ha il tag/nome the_title, il primo parametro $title sono i dati che devono essere cambiati (cioè il titolo del post) e il secondo parametro $id sono informazioni extra (in questo caso l'ID del post).

Per visualizzare il titolo di ogni post in MAIUSCOLO, per esempio, puoi usare la seguente riga:

add_filter('the_title', 'strtoupper');

Se diamo un'occhiata alla funzione add_filter, vediamo che è definita così:

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

Abbiamo specificato solo il primo e il secondo parametro (obbligatori), mentre il terzo e il quarto parametro sono impostati ai rispettivi valori di default (cioè 10 e 1).

Un Filtro Più Complesso

Se vuoi filtrare solo un determinato post, puoi usare le informazioni extra (in questo caso del filtro: l'ID). Per farlo, devi specificare il numero di parametri (che in questo caso è 2), e per fare questo ancora, devi specificare il parametro di priorità (che viene prima del numero di argomenti).

Supponiamo di voler influenzare solo il titolo del post con ID 42, allora sarebbe così:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper

In questo caso, dobbiamo specificare tutti e quattro i parametri disponibili.

Quali Parametri Ho a Disposizione?

Per identificare il numero di parametri disponibili per un certo filtro, devi cercare dove è definito (in questo caso: qui).


Riferimenti:

26 apr 2013 18:27:54
Commenti

+1 per una risposta approfondita e una classe impeccabile (ottima formattazione, brochacho)!

bosco bosco
26 apr 2013 18:41:58

Grazie, è molto dettagliato, ma non spiega realmente quello che chiedevo. Ad esempio, la differenza tra la variabile $value e la variabile $var nel filtro.

r00tAcc3ss r00tAcc3ss
26 apr 2013 19:20:54

Hm, direi che lo fa, ma questa è, ovviamente, la mia sensazione soggettiva. Aggiungerò comunque alcune informazioni sul filtro e i suoi parametri.

tfrommen tfrommen
26 apr 2013 19:24:36