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.

Aaron Lee
źródło
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']
        )
    );
}
kajzer
źródło
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.

Brad Dalton
źródło
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