Probleme în înțelegerea apply_filters()

26 apr. 2013, 17:40:50
Vizualizări: 30.2K
Voturi: 21

În apply_filters()

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

Am dificultăți în înțelegerea parametrilor $value și $var. Am citit documentația și se pare că $value poate fi modificat, iar $var nu, dar nu am găsit exemple concrete pentru acest lucru. Pare să fie folosit ca o modalitate de a transmite o variabilă. În acest caz, care este diferența dintre acesta și $var?

0
Toate răspunsurile la întrebare 2
3
36

Încearcă să vezi funcția cu nume mai bune:

apply_filters(
    $filter_name,     // folosit pentru add_filter( $filter_name, 'callback' );
    $value_to_change, // singura variabilă a cărei valoare poți schimba
    $context_1,       // context
    $context_2        // mai mult context
);

Deci, când această funcție este apelată ca:

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

Poți folosi …

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

… și primești două variabile transmise către acea funcție. Returnezi prima, iar a doua oferă doar mai mult context:

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

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

    return $classes;
}

Variabilele suplimentare sunt acolo pentru a-ți ușura deciziile, nu pentru a le schimba și pe acelea.

26 apr. 2013 17:54:24
Comentarii

Dacă înțeleg corect. Nu adaug o variabilă pentru a colecta valoarea returnată de apply_filters deoarece aceasta este aplicată automat la $value_to_change?

r00tAcc3ss r00tAcc3ss
26 apr. 2013 18:21:13

@r00tAcc3ss Nimic nu se întâmplă automat. Trebuie să modifici valoarea în callback-ul tău. Poți de asemenea să o returnezi neschimbată dacă dorești – în funcție de context.

fuxia fuxia
26 apr. 2013 18:33:53

Ah, da. Mă refeream că nu trebuie să accept valoarea returnată într-o altă variabilă și să o atribui lui $value. Asta se întâmplă, dacă modific $value în funcția hooked și o returnez, "automat."

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

Ce sunt Filtrele?

Filtrele sunt funcții prin care WordPress trece datele, în anumite puncte de execuție, chiar înainte de a lua o acțiune cu aceste date (cum ar fi adăugarea lor în baza de date sau trimiterea lor către ecranul browserului). Filtrele stau între baza de date și browser (când WordPress generează pagini), și între browser și baza de date (când WordPress adaugă postări și comentarii noi în baza de date); majoritatea intrărilor și ieșirilor în WordPress trec prin cel puțin un filtru. WordPress efectuează unele filtrare în mod implicit, iar plugin-ul tău poate adăuga propriile filtre.

Conectarea la un Filtru

Pentru a permite utilizatorilor să modifice anumite date specifice (o valoare, rezultatul unei funcții etc.), sunt furnizate cârlige de filtrare prin funcțiile apply_filters.
Aceste cârlige includ numele (sau eticheta) filtrului și cel puțin numele funcției care va fi folosită pentru a filtra (adică a modifica într-un fel) datele.

Pentru a modifica titlul unei postări, poți folosi cârligul de filtrare the_title, care este definit astfel:

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

Aceasta înseamnă că filtrul are eticheta/numele the_title, primul parametru $title reprezintă datele care trebuie modificate (adică titlul postării), iar al doilea parametru $id oferă informații suplimentare (în acest caz, ID-ul postării).

Pentru a afișa titlul fiecărei postări cu LITERE MARI, de exemplu, poți folosi următoarea linie:

add_filter('the_title', 'strtoupper');

Dacă ne uităm la funcția add_filter, vedem că este definită astfel:

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

Am specificat doar primul și al doilea parametru (obligatoriu), în timp ce al treilea și al patrulea parametru au valorile implicite (adică 10 și 1).

Un Filtru Mai Complex

Dacă dorești să filtrezi doar o anumită postare, poți folosi informațiile suplimentare (în cazul acestui filtru: ID-ul). Pentru a face acest lucru, trebuie să specifici numărul de parametri (care este 2 în acest caz), iar pentru a face acest lucru din nou, trebuie să specifici parametrul de prioritate (care vine înaintea numărului de argumente).

Să presupunem că vrem să afectăm doar titlul postării cu ID-ul 42, atunci codul ar arăta astfel:

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

În acest caz, trebuie să specificăm toți cei patru parametri disponibili.

Ce Parametri Am Disponibili?

Pentru a identifica numărul de parametri disponibili pentru un anumit filtru, trebuie să cauți unde este definit (în acest caz: aici).


Referințe:

26 apr. 2013 18:27:54
Comentarii

+1 pentru un răspuns detaliat și o clasă impecabilă (formatare frumoasă, frate)!

bosco bosco
26 apr. 2013 18:41:58

Mulțumesc, este foarte detaliat, dar nu explică cu adevărat ceea ce am întrebat. De exemplu, diferența dintre variabila $value și variabila $var în filtru.

r00tAcc3ss r00tAcc3ss
26 apr. 2013 19:20:54

Hm, aș spune că o face, dar asta este, desigur, senzația mea subiectivă. Voi adăuga totuși câteva informații despre filtru și parametrii săi.

tfrommen tfrommen
26 apr. 2013 19:24:36