Problemy ze zrozumieniem apply_filters ()

19

W Apply_filters ()

apply_filters( $tag, $value, $var ... );

Mam problem z owinięciem głowy wokół $valuei $var. Czytam kodeks i wydaje się, że $valuemożna go modyfikować, $varnie, ale nie znalazłem żadnych przykładów tego na wolności. Wydaje się być wykorzystywany jako sposób na przekazanie zmiennej. W takim razie jaka jest różnica między tym a tym $var?

r00tAcc3ss
źródło

Odpowiedzi:

35

Spróbuj zobaczyć funkcję o lepszych nazwach:

apply_filters(
    $filter_name,     // used for add_filter( $filter_name, 'callback' );
    $value_to_change, // the only variable whose value you can change
    $context_1,       // context
    $context_2        // more context
);

Kiedy więc ta funkcja jest wywoływana jako:

// wp-login.php line 94
apply_filters( 'login_body_class', $classes, $action );

Możesz użyć …

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );

… I uzyskaj dwie zmienne przekazane do tej funkcji. Zwracasz pierwszy, drugi zapewnia tylko więcej kontekstu:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

Dodatkowe zmienne mają ułatwić podejmowanie decyzji, a także ich nie zmieniać.

fuxia
źródło
Jeśli poprawnie rozumiem. Nie dodam zmiennej, aby zebrać zwróconą wartość z filtrów_zastosowania, ponieważ jest ona automatycznie stosowana do zmiany wartości do $?
r00tAcc3ss
@ r00tAcc3ss Nic nie dzieje się automatycznie. Musisz zmienić wartość w wywołaniu zwrotnym. Możesz również zwrócić go bez zmian, jeśli chcesz - w zależności od kontekstu.
fuxia
O tak. Miałem na myśli, że nie muszę akceptować zwracanej wartości w innej zmiennej i przypisywać jej wartości $. Dokonuje się tego, jeśli zmienię wartość $ w funkcji przechwyconej i zwrócę „automatycznie”.
r00tAcc3ss
11

Co to są filtry?

Filtry to funkcje, przez które WordPress przesyła dane w określonych momentach wykonania, tuż przed podjęciem pewnych działań z danymi (takich jak dodanie do bazy danych lub wysłanie do ekranu przeglądarki). Filtry znajdują się między bazą danych a przeglądarką (gdy WordPress generuje strony) oraz między przeglądarką a bazą danych (gdy WordPress dodaje nowe posty i komentarze do bazy danych); większość danych wejściowych i wyjściowych w WordPressie przechodzi przez co najmniej jeden filtr. WordPress domyślnie filtruje, a Twoja wtyczka może dodawać własne filtrowanie.

Podłączenie do filtra

Aby umożliwić użytkownikom zmianę niektórych określonych danych (wartości, wyniku funkcji itp.), Za pomocą apply_filtersfunkcji dostarczane są haki filtrów .
Te zaczepy filtrów zawierają nazwę (lub znacznik ) filtra i przynajmniej nazwę funkcji, która ma zostać użyta do filtrowania (tj. Zmiany w jakiś sposób) danych.

Aby zmienić tytuł posta, możesz użyć the_titlehaka filtru, który jest zdefiniowany w następujący sposób:

apply_filters( 'the_title', $title, $id );

Oznacza to, że filtr ma znacznik / nazwę the_title, pierwszy parametr $titleto dane, które należy zmienić (tj. Tytuł postu), a drugi parametr $idto dodatkowe informacje (w tym przypadku identyfikator postu).

Aby na przykład wyświetlić tytuł każdego posta w WIELKIM LITERZE, możesz użyć następującego wiersza:

add_filter('the_title', 'strtoupper');

Jeśli spojrzymy na add_filterfunkcję, zobaczymy, że jest ona zdefiniowana w następujący sposób:

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

Podaliśmy tylko pierwszy i drugi (wymagany) parametr, podczas gdy trzeci i czwarty parametr jest ustawiony na odpowiednią wartość domyślną (tj. 10I 1).

Bardziej złożony filtr

Jeśli chcesz filtrować tylko określony post , możesz użyć dodatkowych informacji (w przypadku tego filtra: identyfikator). Aby to zrobić, musisz określić liczbę parametrów (w tym przypadku jest to 2), a aby to zrobić ponownie, musisz określić parametr priorytetu (który występuje przed liczbą argumentów).

Załóżmy, że chcemy wpływać tylko na tytuł posta o identyfikatorze 42, wtedy wygląda to tak:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper

W takim przypadku musimy określić wszystkie cztery dostępne parametry.

Jakie mam parametry?

Aby zidentyfikować (liczbę) dostępnych parametrów określonego filtra, musisz sprawdzić, gdzie jest on zdefiniowany (w tym przypadku: tutaj ).


Referencje :

tfrommen
źródło
2
+1 za dokładną odpowiedź i nienaganną klasę (ładne formatowanie brochacho)!
bosco
Dzięki, to bardzo dokładne, ale tak naprawdę nie wyjaśnia, o co prosiłem. na przykład. różnica między zmienną $ value a zmienną $ var w filtrze.
r00tAcc3ss
Hm, powiedziałbym, że tak, ale takie jest moje subiektywne odczucie. Dodam jednak trochę informacji o filtrze i jego parametrach.
tfrommen