W poprzednia część naszej serii stworzyliśmy podstawę dla wtyczki WordPress rozpoznawalnej przez rdzeń. Dzisiaj dowiemy się, jak właściwie zmienić domyślną funkcjonalność rdzenia.

Koncepcja haków, akcji i filtrów jest za to odpowiedzialna; będąc prawdziwym sercem całego systemu wtyczek WordPress.

Wszystko zaczyna się od "haków" dostarczanych przez sam rdzeń.

Co to jest "hak"? Jest to specjalnie oznaczone miejsce w kodzie (dowolnego skryptu), gdzie niektóre celowo zarejestrowane - "podpięte do" - funkcje mogą być wykonywane w kolejności określonej podczas rejestracji.

WordPress ma dwa rodzaje haczyków, które różnią się ich przeznaczeniem:

  • Hak akcji: zaznacza miejsce wykonania akcji, na przykład, wejście procesu i wyniki przechowywania w bazie danych
  • Haczyk filtra: oznacza miejsce zastosowania modyfikacji do wartości (zwykle dostarczanej jako zmienna), tak aby poniższy kod używał skorygowanej wartości

Przejdźmy do szczegółów ...

Praca z działaniami

Wspólna logika działań WordPress jest bardzo prosta:

  1. Zaznacz miejsce, w którym powinien znajdować się niestandardowy kod, z "hakiem akcji" i jego parametrami
  2. Utwórz funkcję akcji, która wykonuje nowy kod, używając parametrów (jeśli to konieczne) dostarczonych przez hak
  3. Zarejestruj akcję (nr 2), która ma zostać wykonana, gdy hak (nr 1) zostanie uruchomiony z pewnym priorytetem
  4. Kiedy WordPress wczyta żądaną stronę i znajdzie hak, wyszuka wszystkie funkcje "podpięte do niej" i wykona je jeden po drugim zgodnie z ich priorytetem

Aby wykonać zadanie nr 1, mamy funkcję "doktoranckie":

do_action($tag, $arg_1, $arg_2, ... , $arg_n);

Przyjmuje następujące parametry: $ tag - haczyk "nazwa", który pomaga zidentyfikować pewien hak i odróżnić go między innymi; $ arg_1, $ arg_2, ..., $ arg_n - wartości dla działań do zaakceptowania jako parametry. Może być tyle argumentów, ile potrzeba - od zera do rozsądnej kwoty.

Sam WordPress ma wiele predefiniowanych haczyków do użycia:

do_action( 'init' );

Jest to bardzo prosty przypadek bez dodatkowych parametrów. Ten hak jest uruchamiany, gdy ustawiona jest większa część WordPressa i nadszedł czas na rejestrację niestandardowych obiektów, takich jak np. Niestandardowy typ postu.

do_action('save_post', $post_id, $post);

W tym przykładzie hak jest uruchamiany, gdy zapis jest zapisany i daje dwa dodatkowe parametry do działania z - post_id i obiektem post zawierającym wszystkie dane z zapisanego postu.

Ale tworzenie haczyków to nie tylko przywilej głównego zespołu; każdy programista może zrobić niestandardowy hak dla wtyczki (lub motywu). Dzięki temu mamy dużą moc, na przykład struktury tematyczne pozwalają na zmiany motywów podrzędnych nie tylko stylów, ale nawet znaczników rodziców bez nadpisywania całych plików.

do_action( 'my_truly_custom_hook' );

Kiedy znaleźliśmy (lub stworzyliśmy) odpowiedni hak i utworzyliśmy dla niego niestandardową funkcję, powinniśmy zarejestrować najnowszą wersję dla wykonania za pomocą "add_action".

add_action($tag, $function_to_add, $priority, $accepted_args_number);

Jak można się było spodziewać, metoda add_action przyjmuje dwa obowiązkowe parametry: $ tag: nazwa odpowiedniego haka i $ function_to_add: nazwa funkcji, która powinna zostać wykonana. Pozostałe dwa parametry są opcjonalne: $ priority: liczba całkowita określająca kolejność, w jakiej wykonywane są zarejestrowane funkcje (domyślnie 10), $ accepted_args_number: liczba argumentów, które zarejestrowana funkcja ma zaakceptować (domyślnie 1) .

Spójrzmy na przykład ilustrujący cały proces. Przypuśćmy, że chcielibyśmy dodać małe ogłoszenie na dole naszej strony. Możemy użyć do tego haka "wp_footer", ponieważ jest to część obowiązkowego kodu stopki, który powinien zawierać każdy motyw.

function msp_helloworld_footer_notice(){echo "
Hello, I'm your custom notice
";}add_action('wp_footer', 'msp_helloworld_footer_notice');

W tym przykładzie tworzymy prefiksowaną funkcję, która po prostu wypisuje znacznik zawiadomienia (znaczenie przedrostków, o których mówiliśmy w poprzedni artykuł , więc zapoznaj się z nim po szczegóły), a następnie podłącz go do 'wp_footer'. Po umieszczeniu tego kodu w naszym pliku wtyczki (omówionym również w poprzednim artykule), zobaczysz wynik na stronie.

cnotice

Praca z filtrami

Filtry działają z tą samą logiką co akcje. Jedyna różnica polega na tym, że nie wykonują po prostu jakiegoś fragmentu kodu w określonym miejscu. Wykonują ten kod, ABY ZMIENIĆ pewną wartość nadaną im przez hak. Oznacza to, że każdy hak filtra ma przypisaną wartość (w większości przypadków jest przenoszona przez zmienną).

Funkcja wykonująca filtrowanie powinna przyjąć tę wartość, zmienić ją w jakiś sposób, a następnie zwrócić do dalszego wykorzystania. Tak więc składnia funkcji odpowiedzialnych za haki i filtry jest nieco inna.

apply_filters($tag, $value_to_filter, $arg_1, $arg_2, ... , $arg_n);

Funkcja 'apply_filter' tworzy hook filtra z $ tag name i obowiązkowym parametrem $ value_to_filter (może być pusty, ale powinien być obecny dla najlepszej praktyki). Inne argumenty są opcjonalne i działają tak samo, jak w przypadku akcji.

filter_function($value_to_filter, $arg_1, $arg_2, ... , $arg_n){//filtering code goes herereturn $value_to_filter; //value has to be returned back}

Jest to szkielet funkcji filtrującej pokazujący, że powinien on a) przyjąć co najmniej jeden argument, wartość do modyfikacji; oraz b) zwracają wartość na końcu.

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

Funkcja "add_filter" rejestruje funkcję o nazwie podanej jako argument $ function_to_add dla haka filtrów $ tag. Opcjonalne argumenty - $ priority i $ accepted_args - działają w taki sam sposób, jak w przypadku haków akcji.

Pozwól nam zademonstrować cały proces w działaniu: typowym zadaniem wtyczki jest dodanie niektórych treści na końcu postu. Jeśli przyjrzymy się bliżej znacznikowi szablonu "the_content" ( queryposts.com/function/the_content ), który jest zwykle używany do wyprowadzania treści postu w motywie, stwierdzimy, że zawiera on następujący hak filtra:

$content = apply_filters('the_content', $content);

Za pomocą tego haka możemy łatwo dodać coś na koniec postu w następujący sposób:

function msp_helloworld_post_footer($content) {$content .= "";return $content;}  add_filter ("the_content", "msp_helloworld_post_footer", 100); 

Zauważ, że używamy dość dużej liczby jako priorytet, aby upewnić się, że wszystkie domyślne filtry zostały zastosowane przed naszym "msp_helloworld_post_footer". Po dodaniu kodu do pliku wtyczki powinniśmy zobaczyć wynik na stronie:

pfooter

Jak znaleźć haczyki

Powinno być już oczywiste, że dla implementacji działania i funkcji filtrowania musimy wiedzieć, jakie haczyki są dostępne.

Kodeks WordPress zapewnia Referencje działania z większością haków akcji uruchamianych przy typowym ładowaniu strony i Odniesienie do filtra z listą najczęściej używanych filtrów. Odnośniki te są przydatne do zrozumienia kolejności działań i logiki filtrów, dzięki czemu będziesz mógł wybrać miejsce i czas, w którym można i należy wstrzykiwać funkcje.

Następnie jesteś gotowy na podróż do kodu źródłowego. Możesz po prostu przeszukać pliki WordPress dla słów kluczowych "do_action" i "apply_filters", aby znaleźć potrzebny hak.

Zrozumienie Logika zapytań WordPress może również pomóc w ustaleniu, gdzie można szukać niektórych haczyków.

Na koniec możesz odwołać się do Baza haków WordPress zawiera pełną informację o hakach w plikach podstawowych.

Zaawansowane operacje z hakami

Oprócz dodawania do wtyczki, działania i filtry można również usunąć przy użyciu podobnej składni.

Akcje można usunąć w następujący sposób:

remove_action($tag, $function_to_remove, $priority, $accepted_args);remove_all_actions($tag, $priority);

Jak już pewnie się domyśliłeś, "remove_action" usuwa konkretną akcję zarejestrowaną dla danego haka (musisz poprawnie podać priorytet i liczbę argumentów użytych przy rejestracji), a "remove_all_actions" pomaga usunąć wszystkie akcje zarejestrowane w pewnym hook z danym priorytetem (jeśli pominięty zostanie argument priorytetu, funkcja usunie wszystkie akcje).

Prawdopodobnie słyszałeś o popularnym zaleceniu dotyczącym bezpieczeństwa, aby ukryć wersję WordPress w głównej sekcji strony. To jest praca dla "usunięcia".

Przede wszystkim znajdź kod, który przechwytuje funkcję "wp_generator", aby wydrukować informacje o wersji poprzez przeglądanie /wp-includes/default-filters.php . Kod robiący to wygląda następująco:

add_action('wp_head', 'wp_generator');

Aby wyeliminować efekt tego kodu, powinniśmy gdzieś w naszej wtyczce, włączyć funkcję przeciwną:

remove_action('wp_head', 'wp_generator');

Filtry można usunąć w podobny sposób:

remove_filter($tag, $function_to_remove, $priority, $accepted_args);remove_all_filters($tag, $priority);

The Plugin API zapewnia również programistom sposób na wykrycie, czy dany hak ma zarejestrowane funkcje do wykonania:

has_action($tag, $function_to_check);has_filter($tag, $function_to_check);

Obie funkcje sprawdzają, czy dana czynność lub filtr jest zarejestrowany dla haka i zwraca: true w przypadku sukcesu, false w przypadku niepowodzenia. Wewnątrz funkcji haczyka mamy możliwość sprawdzenia, który hak uruchomił jego wykonanie w następujący sposób:

if('hook_to_check_name' === current_filter()){//do stuff related to 'hook_to_check_name' hook}

Pomimo nazwy, "current_filter" działa nie tylko z filtrami, ale także z działaniami. Pełen zestaw funkcji API wtyczek zawiera sekcja Kodeks .

Przypadek w świecie rzeczywistym

Odkopmy szkielet wtyczki, który przygotowaliśmy poprzednia część serii i wciągnąć w to trochę życia.

Wypełnimy plik "core.php" (centralna część naszej wtyczki, która ma w pełni wykorzystać funkcjonalność) za pomocą kodu, który rozwiązuje zadanie w świecie rzeczywistym za pomocą akcji i filtrów.

Co zamierzamy zrobić? Załóżmy, że Twoja witryna WordPress przyjmuje posty gości od różnych autorów, ale nie daje im uprawnień do tworzenia własnych kont do publikowania. Oznacza to, że użytkownik, który opublikował artykuł, oraz jego prawdziwy autor (gość) to różni ludzie. Musisz upewnić się, że faktyczny autor otrzymuje kredyt. Można to zrobić za pomocą niestandardowej taksonomii.

Stwórzmy niestandardowa taksonomia do obsługi nazwiska autora gościnnego (jako określenia) i biografii autora (jako opisu). Moglibyśmy przypisać nazwy autorów do dowolnych innych warunków taksonomii (jako znaczników) do postów. Po tym staje się możliwe wydrukowanie skrzynki autora zaraz po tekście wiadomości. Oto kod:

/** Hook plugin's action and filters **/function msp_helloworld_init(){add_action('init', 'msp_helloworld_taxonomies');add_filter('the_content', 'msp_helloworld_author_block_filter');add_filter('post_class', 'msp_helloworld_post_class');}add_action('plugins_loaded', 'msp_helloworld_init');/** Register custom taxonomy **/function msp_helloworld_taxonomies(){$args = array('labels' => array('name'          => 'Guest authors','singular_name' => 'Guest author'),'show_in_nav_menus' => false);register_taxonomy('gauthor', array('post'), $args);}  / ** Utwórz znacznik pola autorskiego ** / function msp_helloworld_author_block () {global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, 'gauthor'); if (empty ($ author_terms)) return; $ name = stripslashes ( $ author_terms [0] -> name); $ url = esc_url (get_term_link ($ author_terms [0])); $ desc = wp_filter_post_kses ($ author_terms [0] -> description); $ out = " 
"; $ out. ="
To jest guest post przez {$name}
"; $ out. ="
{$desc}
"; return $ out;} / ** Dodaj pole autora na końcu posta ** / function msp_helloworld_author_block_filter ($ content) {if (is_single ()) $ content. = msp_helloworld_author_block (); return $ content;} / * * Dodaj niestandardową klasę CSS do kontenera posta ** / function msp_helloworld_post_class ($ post_class) {global $ post; $ author_terms = wp_get_object_terms ($ post-> ID, 'gauthor'); if (! Empty ($ author_terms)) {$post_class[] = 'gauthor';} return $ post_class;}

Jak widać, stworzyliśmy akcję rejestracji niestandardowej systematyki i zastosowaliśmy ją do haka "init" - jest to zalecana praktyka. Następnie utworzyliśmy znacznik szablonu odpowiedzialny za znaczniki pola autora za pomocą rodzimych funkcji WordPress, takich jak "wp_get_object_terms". Następnie dołączyliśmy to pole do końca treści postu za pomocą haka filtrów "the_content". I na koniec dodaliśmy niestandardową klasę CSS dla kontenerów postów gości w celu zwiększenia elastyczności stylizacji w motywie. Po zastosowaniu niektórych stylów możemy zobaczyć rezultat:

gauthor

Wniosek

Akcje i filtry są najważniejszą częścią każdego rozwoju WordPress. Teraz, gdy rozumiesz ich logikę i zachowanie, jesteś gotowy na własne eksperymenty.

Kliknij tutaj, aby pobrać nasz rozszerzony przykład wtyczki "Hello World", aby użyć go jako szkieletu do własnego rozwoju.

Jakie zastosowania znalazłeś w działaniach i filtrach WordPress? Co chciałbyś zobaczyć w następnej części tej serii? Daj nam znać w komentarzach.

Przedstawiony obraz, Obraz modułu przez Shutterstock