Różnica między filtrami a hakami akcji?


51

Ostatnio przyglądałem się API wtyczki nieco bardziej dogłębnie i zastanawiałem się, jakie są rzeczywiste różnice między działaniem a chwytaniem filtrów . Oba są zdarzeniami, które otrzymują dane jako parametr i wydaje się, że oba są w stanie robić te same rzeczy.

Oczywiście widzę, że akcje są wywoływane, gdy mają miejsce akcje, a filtry są wywoływane, gdy dane są manipulowane, ale wydaje się, że to tylko semantyczna różnica w nazewnictwie.

Oprócz semantyki i do czego służą, jakie są rzeczywiste różnice między nimi?

Odpowiedzi:


58

Cześć @Sruly :

Prawie odpowiedziałeś na swoje pytanie, ale rozwinę trochę.

Haki do akcji

Haki działań są przeznaczone do użycia, gdy rdzeń WordPress, wtyczka lub motyw daje możliwość wstawienia kodu w określonym momencie i wykonania jednej lub więcej z następujących czynności:

  1. Użyj, echoaby wstrzyknąć część HTML lub inną zawartość do bufora odpowiedzi,
  2. Zmodyfikuj stan zmiennej globalnej dla jednej lub więcej zmiennych i / lub
  3. Zmodyfikuj parametry przekazane do funkcji przechwytującej (zakładając, że przechwytywanie zostało wywołane przez do_action_ref_array()zamiast, do_action()ponieważ to ostatnie nie obsługuje przekazywania zmiennych przez odniesienie ).

Filtruj haki

Haki filtru zachowują się bardzo podobnie do haków akcji, ale ich przeznaczeniem jest uzyskanie wartości i potencjalnie zwrócenie zmodyfikowanej wersji wartości. Hak filtrujący może być również użyty tak samo, jak hak akcji, tj. Do zmodyfikowania zmiennej globalnej lub wygenerowania kodu HTML, przy założeniu, że to właśnie powinieneś zrobić po wywołaniu haka. Jedną z rzeczy, która jest bardzo ważna w Filtrach, których nie musisz się martwić dzięki Action Hooks, jest to, że osoba korzystająca z Filtru musi zwrócić (zmodyfikowaną wersję) pierwszy parametr, który został przekazany. Częstym błędem początkującego jest zapomnienie o zwróceniu tej wartości!

Używanie dodatkowych parametrów w celu zapewnienia kontekstu w hakach filtrów

Nawiasem mówiąc, czułem, że haki filtrów były spętane we wcześniejszych wersjach WordPressa, ponieważ otrzymywałyby tylko jeden parametr; tzn. otrzymaliby wartość do modyfikacji, ale nie mieliby 2 lub 3 parametrów, aby zapewnić kontekst. Ostatnio i pozytywnie wydaje się, że zespół podstawowy WordPress z radością (dla mnie) dodaje dodatkowe parametry do Filtrów, abyś mógł odkryć więcej kontekstu. Dobrym przykładem jest posts_wherehaczyk; Wierzę, że kilka wersji wstecz zaakceptowało tylko jeden parametr będący klasą SQL bieżącego” zapytania w bieżącym zapytaniu, ale teraz akceptuje zarówno klauzulę where, jak i odwołanie do bieżącej instancji WP_Queryklasy wywołującej hook.

Więc jaka jest prawdziwa różnica?

W rzeczywistości Haczyki Filtrujące są w zasadzie nadzbiorem Haków Akcji. Ten pierwszy może zrobić wszystko, co drugi może zrobić, a nieco więcej, choć deweloper nie ma obowiązku zwracania wartości za pomocą haka do akcji, który robi za pomocą haka do filtrowania.

Udzielanie wskazówek i intencji telegraficznych

Ale to chyba nie jest ważne. Myślę, że ważne jest to, że deweloper decydujący się na użycie haka akcji vs. haka filtru lub odwrotnie, telegrafuje swoje zamiary, dając tym samym wskazówki twórcy lub twórcy wtyczki, którzy mogą używać haka. W gruncie rzeczy mówią albo: „Zadzwonię do ciebie, zrób wszystko, co musisz zrobić” LUB „Przekażę ci tę wartość, aby ją zmodyfikować, ale upewnij się, że ją oddasz ”.

Tak więc ostatecznie uważam, że wskazówki zapewniane przez wybór rodzaju haka są prawdziwą wartością leżącą u podstaw tego rozróżnienia . W każdym razie IMO.

Mam nadzieję że to pomoże!


Wydaje mi się, że mogłeś po prostu użyć filtrów do wszystkiego, ponieważ zwracanie zmiennej jest opcjonalne w PHP. Czy ktoś wie, dlaczego programiści WordPress wybrali dwa osobne warunki? Czy to wyłącznie z powodów semantycznych? Technicznie nie widzę potrzeby ...
TheStoryCoder,

2
@TheStoryCoder „Czy to wyłącznie z powodów semantycznych?” Wygląda na to, że dokładnie to wyjaśniła moja odpowiedź pięć (5) lat temu ...?
MikeSchinkel,

11

Jeśli spojrzysz na źródło add_action()funkcji podstawowej, jest to po prostu opakowanie add_filter()funkcji ...

A jeśli spojrzysz na funkcję do_action()podstawową, jest ona bardzo podobna do apply_filters()funkcji podstawowej, z jedną bardzo istotną różnicą: nie zwraca wartości.

Co to znaczy? akcje są jak filtry, tyle że akcja nie zwraca wartości, więc nie można modyfikować danych. Pokazuje, że utworzenie mechanizmu działania WordPress było proste, po prostu kopiując mechanizm filtrujący i nie zwracając wartości. Zasadniczo wszystko, co możesz zrobić z akcją, to po prostu wykonać funkcję bez zmiany jakiejś wartości.


5

Krótko mówiąc.

Działania to te funkcje PHP, które wykonują dane wyjściowe.

Filtry to te funkcje PHP, które zwracają dane wyjściowe.

Zaktualizowano: Możemy rozszerzyć dowolną wtyczkę, która korzysta z akcji i filtrów, bez modyfikowania tam kodu. Dodając filtry i działania w naszym własnym motywie lub wtyczce.


Jak używać?

Akcja:

Sprawdź poniżej proste przykłady w swoim functions.phppliku motywu .

  1. Przykład pierwszy: (prosty przykład PHP)
test funkcji () {
     echo „Wyjście”;
}

test();

Powyżej programu wydrukuj wynik:

Wynik

[UWAGA: Tutaj test () po prostu wywołuje funkcję. I uruchom funkcję wywołania zwrotnego „test”.]


  1. Przykład drugi: (Proste użycie akcji)
test funkcji 1 () {
     echo „Wyjście”;
}
działanie dodatkowe („test”, „test1”);

do działań („test”);

Powyżej programu wydrukuj wynik:

Wynik

[UWAGA: Tutaj do_action('test')działa jak funkcja wywołania. I uruchom funkcję zwrotną „test1”.]


  1. Przykład trzeci: (Kolejne użycie akcji)
test funkcji2 () {
     echo „Test 2”;
}
działanie dodatkowe („test”, „test2”, 1);

test funkcji 1 () {
     echo „Test 1”;
}
działanie dodatkowe („test”, „test1”, 2);

do działań („test”);

Powyżej programu wydrukuj wynik:

Test 2 Test 1

[UWAGA: Tutaj do_action('test')działa jak funkcja wywołania. I wykonuj funkcje zwrotne na swoich priorytetach.

Funkcja oddzwaniania „test1” ma priorytet 2, a „test2” ma priorytet 1.]

Jeśli priorytety ulegną zmianie, np. „Test1” z priorytetem 1 i „test2” z priorytetem 2, wynikiem będzie:

Test 1 Test 2

  1. Przykład czwarty: (wsparcie innej firmy) Dodaj poniższy kod wfunctions.php
test funkcji 1 () {
     do działań („test_before”);
     echo „Test 1”;
     do działań („test_after”);
}
działanie dodatkowe („test”, „test1”);

do działań („test”);

Powyżej programu wydrukuj wynik:

Test 1

Teraz utwórz przykładową wtyczkę, aby sprawdzić, jak działa programista zewnętrzny.

  1. Utwórz folder „simple” w /wp-content/plugins/katalogu.
  2. Utwórz plik o nazwie „simple.php” i dodaj poniższy kod.
/ *
* Nazwa wtyczki: prosta wtyczka
* /
funkcja test_callback_function () {
     echo „From plugin”;
}
działanie dodatkowe („test”, „test_callback_function”);

Teraz aktywuj naszą Prostą wtyczkę z pulpitu administratora WordPress.

Idź do wtyczki menu i aktywuj ją.

Po aktywacji wtyczki nad programem wydrukuj wyjście:

Test 1 z wtyczki

[UWAGA: Jeśli dodamy priorytet naszej akcji wtyczki od 1 do 9, to wydrukuje wynik w następujący sposób:

Z wtyczki Test 1

Ponieważ WordPress bierze pod uwagę 10 priority by defaultwszystkie dodane działania.]

Filtry

Sprawdź poniższe przykłady:

Prosty przykład PHP:

$ data = array („one”, „two”);
print_r (dane $);

Powyżej programu wydrukuj wynik:

Tablica ([0] => jeden [1] => dwa)
  1. Przykład pierwszy: (Proste użycie filtra)
$ data = Apply_filters ('my_filter_name', array ('one', 'two'));
print_r (dane $);

add_filter („moja_nazwa_pliku”, funkcja ($ old_data) {
     zwracana tablica („trzy”, „cztery”);
});

Powyżej programu wydrukuj wynik:

Tablica ([0] => trzy [1] => cztery)

Tutaj, dodaliśmy filtr my_filter_namei zmienić istniejące wyjście array( 'one', 'two' )ze array( 'three', 'four' )bez zmieniania plików theme / plugin.



Dzięki @maheshwaghmare za tak prostą sztuczkę. napisz też o „Filtrach”
Adi

Co dokładnie rozumiesz przez „wkrótce”?
Rapti

@Rapti Przepraszamy za opóźnienie. Dzisiaj dodam odpowiedź dotyczącą filtrów. W przyszłości utworzę opisowy artykuł dotyczący haków (akcji i filtrów).
maheshwaghmare

@maheshwaghmare zwlekanie dużo? : P

Dobre wytłumaczenie, teraz lepiej rozumiem
budiantoip
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.