Diferența dintre Filtre și Hook-uri de Acțiune

29 aug. 2010, 15:27:31
Vizualizări: 38.6K
Voturi: 63

Am analizat recent API-ul pentru plugin-uri mai în detaliu și mă întrebam care sunt diferențele reale între hook-urile de acțiune și cele de filtrare. Ambele sunt evenimente care primesc date ca parametru și par să poată face aceleași lucruri.

Evident, observ că acțiunile sunt apelate când au loc anumite acțiuni, iar filtrele sunt apelate când datele sunt manipulate, dar pare să fie doar o diferență semantică în denumire.

Pe lângă semantică și scopul pentru care sunt folosite, care sunt diferențele reale dintre ele?

0
Toate răspunsurile la întrebare 4
3
68

Salut @Sruly:

Practic ți-ai răspuns singur la întrebare, dar voi mai detalia puțin.

Action Hooks

Action Hooks sunt destinate utilizării atunci când WordPress core sau un anumit plugin sau temă îți oferă posibilitatea să inserezi codul tău la un anumit punct și să faci unul sau mai multe dintre următoarele:

  1. Folosește echo pentru a injecta niște HTML sau alt conținut în buffer-ul de răspuns,
  2. Modifică starea unei variabile globale pentru una sau mai multe variabile, și/sau
  3. Modifică parametrii transmiși funcției tale de hook (presupunând că hook-ul a fost apelat prin do_action_ref_array() în loc de do_action(), deoarece acesta din urmă nu suportă transmiterea variabilelor by-reference.)

Filter Hooks

Filter Hooks se comportă foarte similar cu Action Hooks, dar scopul lor este să primească o valoare și să returneze potențial o versiune modificată a acesteia. Un filter hook ar putea fi folosit și exact ca un Action Hook, adică pentru a modifica o variabilă globală sau a genera niște HTML, presupunând că asta ai nevoie să faci când hook-ul este apelat. Un lucru foarte important la Filter Hooks, care nu trebuie să-ți facă griji cu Action Hooks, este că persoana care folosește un Filter Hook trebuie neapărat să returneze (o versiune modificată a) primului parametru primit. O greșeală frecventă a începătorilor este să uite să returneze acea valoare!

Folosirea Parametrilor Adiționali pentru a Furniza Context în Filter Hooks

Ca o paranteză, am simțit că Filter Hooks erau limitate în versiunile mai vechi de WordPress pentru că primeau doar un singur parametru; adică primeau o valoare de modificat, dar fără al doilea sau al treilea parametru pentru a furniza vreun context. Însă, în ultima vreme, și în mod pozitiv, se pare că echipa WordPress core a început (pentru bucuria mea) să adauge parametri suplimentari la Filter Hooks, astfel încât să poți descoperi mai mult context. Un exemplu bun este hook-ul posts_where; cred că acum câteva versiuni acesta accepta doar un singur parametru, fiind clauza SQL "where" a interogării curente, dar acum acceptă atât clauza where, cât și o referință la instanța curentă a clasei WP_Query care apelează hook-ul.

Deci Care este Diferența Reală?

În realitate, Filter Hooks sunt practic un superset al Action Hooks. Primele pot face orice pot face cele din urmă și ceva în plus, deși dezvoltatorul nu are responsabilitatea de a returna o valoare cu Action Hook, așa cum are cu Filter Hook.

Oferirea de Ghidare și Transmiterea Intenției

Dar probabil că asta nu este cel mai important aspect. Cred că ceea ce contează este faptul că, prin alegerea de a folosi un Action Hook în loc de un Filter Hook sau invers, dezvoltatorul transmite intenția și astfel oferă ghidare temarului sau dezvoltatorului de plugin care ar putea folosi hook-ul. În esență, ei spun fie "Am să te apelez, fă orice ai nevoie să faci" SAU "Am să-ți transmit această valoare pentru a o modifica, dar asigură-te că o transmiți înapoi."

Deci, în final, cred că ghidarea oferită prin alegerea tipului de hook este valoarea reală din spatele acestei distincții. Cel puțin așa cred eu.

Sper că te-am ajutat!

29 aug. 2010 16:57:19
Comentarii

Mi se pare că ați fi putut folosi filtre pentru tot, deoarece returnarea unei variabile este opțională în PHP. Știe cineva de ce dezvoltatorii WordPress au ales să aibă doi termeni separați? Este doar din motive semantice? Din punct de vedere tehnic, nu văd nevoia pentru asta...

TheStoryCoder TheStoryCoder
10 iun. 2015 10:27:23

@TheStoryCoder "Este doar din motive semantice?" Se pare că exact asta am explicat în răspunsul meu, acum cinci (5) ani...?

MikeSchinkel MikeSchinkel
14 iun. 2015 02:13:39

Sunt foarte bucuros că am găsit atât această întrebare, cât și acest răspuns. Sunt sigur că majoritatea celor care au votat acestea reflectă, la fel ca mine, gândul că ele sunt în esență același lucru și au găsit în acest răspuns confirmarea și explicația subtilităților în mod satisfăcător clarificator.

ecv ecv
18 mar. 2024 00:46:03
0
14

Dacă te uiți la sursa funcției de bază add_action(), aceasta este doar un wrapper pentru funcția add_filter()...

Și dacă examinezi funcția de bază do_action(), aceasta este foarte asemănătoare cu funcția de bază apply_filters(), cu o diferență esențială: nu returnează nicio valoare.

Deci ce înseamnă asta? Acțiunile sunt ca filtrele, cu excepția faptului că o acțiune nu returnează o valoare, așa că nu poți modifica date. Aceasta arată că a fost simplu să creezi mecanismul de acțiuni al WordPress prin simpla copiere a mecanismului de filtrare, fără a returna o valoare. Practic, tot ce poți face cu o acțiune este să execuți o funcție fără a modifica vreo valoare.

29 iun. 2013 21:41:50
7

În termeni simpli.

Acțiunile sunt acele funcții PHP care execută output-ul.

Filtrele sunt acele funcții PHP care returnează output-ul.

Actualizat: Putem extinde orice plugin care folosește acțiuni și filtre fără a modifica codul acestuia. Prin adăugarea de filtre și acțiuni în propriul nostru temă sau plugin.


Cum se folosesc?

Acțiuni:

Verificați exemplele simple de mai jos în fișierul functions.php al temei.

  1. Exemplul Unu: (Exemplu PHP simplu)
function test() {
     echo "Output";
}

test();

Programul de mai sus afișează output-ul:

Output

[NOTĂ: Aici test() apelează pur și simplu funcția. Și execută funcția callback 'test'.]


  1. Exemplul Doi: (Utilizare simplă a Acțiunilor)
function test1() {
     echo "Output";
}
add_action( 'test', 'test1' );

do_action( 'test' );

Programul de mai sus afișează output-ul:

Output

[NOTĂ: Aici do_action('test') funcționează ca un apel de funcție. Și execută funcția callback 'test1'.]


  1. Exemplul Trei: (Altă utilizare a Acțiunilor)
function test2() {
     echo "Test 2";
}
add_action( 'test', 'test2', 1 );

function test1() {
     echo "Test 1";
}
add_action( 'test', 'test1', 2 );

do_action( 'test' );

Programul de mai sus afișează output-ul:

Test 2Test 1

[NOTĂ: Aici do_action('test') funcționează ca un apel de funcție. Și execută funcțiile callback în funcție de prioritățile lor.

Funcția callback 'test1' are prioritatea 2 iar 'test2' are prioritatea 1. ]

Dacă prioritățile sunt schimbate, de exemplu 'test1' cu prioritatea 1 și 'test2' cu prioritatea 2, atunci output-ul va fi:

Test 1Test 2

  1. Exemplul Patru: (Suport pentru terți) Adăugați codul de mai jos în functions.php
function test1() {
     do_action( 'test_before' );
     echo "Test 1";
     do_action( 'test_after' );
}
add_action( 'test', 'test1' );

do_action( 'test' );

Programul de mai sus afișează output-ul:

Test 1

Acum, creați un plugin simplu pentru a verifica cum funcționează pentru dezvoltatorii terți.

  1. Creați folderul 'simple' în directorul /wp-content/plugins/.
  2. Creați un fișier numit 'simple.php' și adăugați codul de mai jos.
/*
* Plugin Name: Simple Plugin
*/
function test_callback_function() {
     echo "From plugin";
}
add_action( 'test', 'test_callback_function' );

Acum, activați plugin-ul nostru Simple din panoul de administrare WordPress.

Accesați meniul de plugin-uri și activați-l.

După activarea plugin-ului, programul de mai sus va afișa output-ul:

Test 1From plugin

[NOTĂ: Dacă adăugăm prioritatea pentru acțiunea plugin-ului nostru de la 1 la 9, atunci va afișa output-ul astfel:

From pluginTest 1

Deoarece WordPress consideră prioritatea 10 implicit pentru toate acțiunile adăugate.]

Filtre

Verificați exemplele de mai jos:

Exemplu PHP simplu:

$data = array( 'one', 'two' );
print_r( $data );

Programul de mai sus afișează output-ul:

Array ( [0] => one [1] => two )
  1. Exemplul Unu: (Utilizare simplă a Filtrelor)
$data = apply_filters( 'my_filter_name', array( 'one', 'two' ) );
print_r( $data );

add_filter( 'my_filter_name', function( $old_data ) {
     return array( 'three', 'four' );
});

Programul de mai sus afișează output-ul:

Array ( [0] => three [1] => four )

Aici, am adăugat filtrul my_filter_name și am schimbat output-ul existent array( 'one', 'two' ) cu array( 'three', 'four' ) fără a modifica fișierele temei/plugin-ului.


3 feb. 2017 17:37:31
Comentarii

Mulțumesc @maheshwaghmare pentru acest truc simplu. Te rog să scrii și despre 'Filters'.

Adi Adi
22 feb. 2017 12:59:19

Ce anume înțelegi prin "în curând"?

Rapti Rapti
4 apr. 2017 16:15:39

@Rapti Îmi cer scuze pentru întârziere. Astăzi seară voi adăuga răspunsul legat de filtre. În viitor voi crea un articol detaliat despre Hooks (Actions & Filters).

maheshwaghmare maheshwaghmare
4 apr. 2017 17:02:42

@maheshwaghmare procrastinezi mult? :P

User User
4 mai 2017 04:37:09

Explicație bună, acum am o înțelegere mai clară

Budianto IP Budianto IP
11 feb. 2018 20:01:39

De ce să nu apelezi metodele direct și de ce să nu filtrezi datele direct acolo unde sunt necesare? Care este adevăratul scop al metodelor do_action, add_action și apply_filters?

f_i f_i
18 mar. 2018 16:55:01

Motivul este extinderea funcționalității temei sau a plugin-ului fără a modifica codul lor.

maheshwaghmare maheshwaghmare
18 mar. 2018 16:56:46
Arată celelalte 2 comentarii
0

Diferența principală dintre un action și un filter poate fi rezumată astfel:

  • un action primește informația, face ceva cu ea și nu returnează nimic. Cu alte cuvinte: acționează asupra ceva și apoi iese, fără a returna nimic înapoi către hook-ul apelant.
  • un filter primește informația, o modifică într-un fel și o returnează. Cu alte cuvinte: filtrează ceva și o trimite înapoi către hook pentru utilizare ulterioară.

Spus altfel:

  • un action întrerupe fluxul de cod pentru a face ceva, apoi revine la fluxul normal fără a modifica nimic;
  • un filter este folosit pentru a modifica ceva într-un anumit fel, astfel încât modificarea să fie folosită ulterior de cod.

Ceea ce se referă este lista de parametri trimisă prin definiția hook-ului.

Din documentația oficială WP

16 nov. 2020 12:36:52