Jak filtry i haki naprawdę działają w PHP


21

Jak faktycznie działają filtry i haki w WordPress?

Pytam o coś zaawansowanego. Jak to jest zaimplementowane w PHP? Na przykład, w jaki sposób zbiera wszystkie haki z różnych wtyczek i „dołącza” je do haków rdzenia itp.


2
O ile wiem, w php nie ma żadnych „haków” ani „filtrów”, są też funkcje. Wordpress ma specjalne funkcje, które przed ich wykonaniem wykorzystują wywołanie zwrotne innych funkcji.
— Ofir Baruch,


3
@OfirBaruch, jestem prawie pewien, że OP odnosił się do ich implementacji w WordPressie i nie sugerował, że jest jakaś natywna implementacja PHP.
— Tom Auger

Odpowiedzi:


33

Przegląd

Zasadniczo „ Plugin API ”, który przywołuje filtry i hooki, składa się z następujących funkcji:

  1. apply_filters()- wykonać
  2. do_action- wykonać
  3. apply_filters_ref_array()- wykonać
  4. do_action_ref_array()- wykonać
  5. add_filter()- dodaj do stosu
  6. add_action()- dodaj do stosu

Podstawowe elementy wewnętrzne

Ogólnie rzecz biorąc, istnieje kilka globali (co jeszcze w świecie WordPress):

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

Pierwszy $wp_filterto globalny, Arrayktóry przechowuje wszystkie nazwy filtrów jako podcienie. Każda z tych podrzędnych zawiera następnie jeszcze więcej podrzędnych, które są wywołaniami zwrotnymi przywołanymi w tablicy priorytetowej.

Krótki w szczegółach

Kiedy więc wywoływana jest funkcja wykonywania , WordPress przeszukuje tablice globałów w poszukiwaniu kluczy o tej nazwie. Następnie dołączone wywołania zwrotne są wykonywane priorytet po priorytecie. Jedyne, co dzieje się z przodu, to wywołania zwrotne dołączone do allfiltra.

Po dodaniu wywołania zwrotnego za pomocą add_actionlub add_filter, WordPress najpierw oblicza „unikalny” identyfikator, aby nie zastępować już dołączonych wywołań zwrotnych.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Następnie dodaje oddzwonienie do global $wp_filterstosu:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Jak widać, główną podrzędną tablicą jest $tag(lub nazwa akcji / filtru), wtedy wszystko jest przywoływane pod określonym priorytetem, a następnie „kluczowy” ciąg zwrotny / identyfikator zostaje użyty jako klucz.

Później, gdy wywoływany jest filtr - dzieje się to z nazwą $tag/ action- / filter-name - tablica jest przeszukiwana i wywoływane są wywołania zwrotne. Podczas używania call_user_func_arraynie ma znaczenia, ile argumentów jest dołączonych. WordPress sam to rozwiązuje.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}

3
nie zapominaj, że podczas przechodzenia przez wywołania zwrotne, zleca wykonanie wielu wywołań zwrotnych na tym samym haku, używając ich „priorytetu”, który jest ustawiony (opcjonalnie) za pomocą add_action () i apply_filters () i domyślnie ustawiony na 10.
— Tom Auger

1
@TomAuger Prosimy dodawać wszelkie dodatkowe uwagi i zmiany do odpowiedzi.
— kaiser

5

Haki są zawarte zarówno w podstawowych plikach WordPress, jak i w niektórych plikach motywów nadrzędnych. Umożliwiają zaczepienie zawartości w określonej lokalizacji w pliku.

Przykładem jest hak wp_head w WordPress. Możesz użyć tego haka w motywie podrzędnym, aby dodać treść w tej lokalizacji „

Przykład:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Niektóre motywy premium zawierają również haczyki akcji, których można użyć w motywie potomnym, aby zrobić to samo. Oto mapa wizualna, która zawiera wszystkie haczyki akcji i pozycję, w której wyprowadzają twoją treść w ramach motywu Genesis.

Przykład:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Oto jak wygląda hak, jeśli otworzysz plik header.php w strukturze motywu Genesis:

do_action( 'genesis_header' );

Oto lista haków WordPress, których możesz używać na wiele sposobów.

Filtry pozwalają modyfikować dane wyjściowe istniejącej funkcji i są zawarte zarówno w podstawowych plikach WordPress, jak i w niektórych nadrzędnych ramach tematycznych, takich jak Genesis.

Oto lista filtrów, których możesz używać z Genesis Design Framework

Oto lista filtrów zawartych w WordPress

Oto przykład, w jaki sposób można użyć filtra w ramach motywu, takich jak Genesis:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

Powyższy kod może być użyty w motywie podrzędnym do modyfikacji tekstu autora w komentarzach. Działa w każdym temacie.

Oto kolejny przykład, który dostosowuje długość fragmentów do 50 słów:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

Znajdziesz funkcję the_excerpt () w pliku wp-include / post-template.php.

Oto jak to wygląda:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

Możesz również użyć haczyków i filtrów we wtyczkach, aby zrobić dokładnie to samo, a kod nie zostanie utracony podczas aktualizacji motywu nadrzędnego lub WordPressa.

Zasadniczo zaczepy i filtry umożliwiają dostosowanie i modyfikację zarówno WordPress, jak i motywu nadrzędnego bez edytowania podstawowych plików WordPress lub plików motywu nadrzędnego.

Znacznie łatwiej jest dostosować motyw podrzędny, gdy struktura motywu nadrzędnego zawiera zaczepy i filtry, ponieważ nigdy nie trzeba edytować plików szablonów motywów nadrzędnych. W ten sposób możesz również bezpiecznie zmieniać motywy.


2
Jest to świetny ogólny przegląd haków i filtrów, ale obawiam się, że całkowicie pomija się pytanie OP, które dotyczy wewnętrznych sposobów działania haków i tego, jak WordPress je tworzy, przechowuje i przetwarza. Świetna odpowiedź; prawdopodobnie powinieneś link do swojego samouczka na stronach WP.
— Tom Auger

Ok usunę to. Mój zły jak powinienem był lepiej przeczytać pytanie, ale pomyślałem, że odpowiedzi już udzielone byłyby łatwiejsze dla początkujących, gdyby znali podstawowe.
— Brad Dalton,

2
Brad, cofnąłem to, ponieważ myślę, że przydałoby się też mieć te informacje tutaj. Jeśli się nie zgadzasz, po prostu wspomnij o mnie / pinguj tutaj, a usunę go ponownie.
— kaiser
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.