Diferența dintre add_filter și apply_filters
Am căutat o explicație potrivită despre diferența dintre add_filter()
și apply_filters()
aici dar nu am găsit una.
Poate cineva să-mi spună ce informații sau logică trebuie să iau în considerare înainte de a folosi add_filter
sau apply_filters
într-un anumit context.
Ce face ca utilizarea uneia să fie imperativă și nu a celeilalte?
Este corect că
add_filter
doar adaugă o funcție în coada funcțiilor care așteaptă să fie executate pe o variabilă șiapply_filters
execută funcțiile în ordine?Este de asemenea corect că
apply_filters
când este apelat cu un argument (numele funcției care trebuie rulată) va executa acea funcție înaintea tuturor celorlalte (dacă există) din coadă?

Majoritatea următoarelor informații pot fi găsite în Codex:
apply_filters
Funcțiile de callback atașate la cârligul de filtrare
$tag
sunt invocate prin apelarea acestei funcții. Această funcție poate fi utilizată pentru a crea un nou cârlig de filtrare prin simplul apel al acestei funcții cu numele noului cârlig specificat folosind parametrul $tag.
$value = apply_filters( $tag, $value, $var_1, $var_2, ... );
În esență:
Folosești apply_filters
pentru a filtra o anumită $value
- în raport cu valoarea în sine precum și cu variabilele opționale furnizate $var_1
până la $var_n
.
add_filter
Atașează o funcție la o acțiune de filtrare specifică.
add_filter( $tag, $function_to_add, $priority, $accepted_args );
În esență:
Folosești add_filter
pentru a atașa o funcție personalizată la acțiunea de filtrare dată ($tag
), pe care ai fi putut-o genera înainte cu apply_filters
(sau a fost o acțiune de filtrare integrată sau provine dintr-un plugin/tema ta).
Deci, iată un exemplu fictiv:
function print_initials( $name ) {
if ( ! is_string( $name ) ) {
return;
}
$fragments = explode( ' ', $name );
/**
* Filtrează dacă să afișeze inițialele în ordine inversă.
*
* @param bool $reverse Afișează inițialele în ordine inversă?
*/
if ( apply_filters( 'reverse_initials', FALSE ) ) {
$fragments = array_reverse( $fragments );
}
foreach ( $fragments as $f ) {
echo substr( $f, 0, 1 );
}
}
print_initials( 'Some Guy' ); // afișează: SG
add_filter( 'reverse_initials', '__return_true' );
print_initials( 'Some Guy' ); // afișează: GS
Acum, dacă apelăm funcția noastră așa cum este, inițialele sunt afișate de la stânga la dreapta—pentru că asta am definit ca comportament implicit.
A doua oară, obținem inițialele în ordine inversă—deoarece funcția de filtrare __return_true
, care este atașată la acțiunea noastră de filtrare, întoarce întotdeauna TRUE
și astfel face ca inițialele să fie afișate de la dreapta la stânga.

Exemplul de mai sus este exemplul clasic care îi omoară pe dezvoltatorii începători.. Explicat într-un mod dur, dar prietenos pentru oameni, poți folosi apply_filters pentru a crea un filtru personalizat specific pe care îl poți modifica ulterior prin add_filter. Pe de altă parte, dacă folosești un hook deja existent, poți folosi direct add_filter.. Logica este tipica non-logică a dezvoltării, așa că trebuie să cauți mai multe exemple și să exersezi puțin pentru a "înțelege" cum funcționează.. Știu că chiar și explicația mea poate să nu sune complet clară, (și majoritatea colegilor noștri ar putea să mă omoare pentru inexactități) dar mie mi se pare cea mai ușor de înțeles explicație pe care am găsit-o pe Internet..

Acest lucru nu oferă un răspuns la întrebare. Când vei avea suficientă reputație vei putea comenta pe orice postare; în schimb, oferă răspunsuri care nu necesită clarificări din partea întrebătorului. - Din Recenzie
