Непонимание проблем apply_filters ()

19

В apply_filters ()

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

У меня проблемы с тем, чтобы обернуть голову вокруг $valueи $var. Я прочитал кодекс, и это звучит так, как будто его $valueможно изменить $var, но я не нашел никаких примеров этого в дикой природе. Кажется, он используется как способ передачи переменной. В каком случае, в чем разница между этим и $var?

r00tAcc3ss
источник

Ответы:

35

Попробуйте увидеть функцию с лучшими именами:

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
);

Поэтому, когда эта функция вызывается как:

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

Ты можешь использовать …

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

... и получить две переменные, переданные этой функции. Вы возвращаете первое, второе обеспечивает просто больше контекста:

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

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

    return $classes;
}

Дополнительные переменные помогут вам принять решение, а не изменить его.

Фуксия
источник
Если я правильно понимаю. Я не добавляю переменную для сбора возвращенного значения из apply_filters, так как оно автоматически применяется к $ value_to_change?
r00tAcc3ss
@ r00tAcc3ss Ничего не происходит автоматически. Вы должны изменить значение в вашем обратном вызове. Вы также можете вернуть его без изменений, если хотите - в зависимости от контекста.
fuxia
О, да. Я имел в виду, мне не нужно принимать возвращенное значение в другую переменную и присваивать ему значение $ value. Это делается, если я изменил значение $ в подключенной функции и вернул «автоматически».
r00tAcc3ss
11

Что такое фильтры?

Фильтры - это функции, через которые WordPress передает данные в определенные моменты выполнения непосредственно перед тем, как предпринимать какие-либо действия с данными (например, добавлять их в базу данных или отправлять на экран браузера). Фильтры располагаются между базой данных и браузером (когда WordPress генерирует страницы) и между браузером и базой данных (когда WordPress добавляет новые сообщения и комментарии в базу данных); Большая часть ввода и вывода в WordPress проходит как минимум через один фильтр. WordPress выполняет некоторую фильтрацию по умолчанию, и ваш плагин может добавить свою собственную фильтрацию.

Привязка к фильтру

Чтобы позволить пользователям изменять некоторые конкретные данные (значение, выходные данные функции и т. Д.), Через apply_filtersфункции предоставляются ловушки фильтра .
Эти ловушки фильтра включают имя (или тег ) фильтра и, по крайней мере, имя функции, которая должна использоваться для фильтрации (то есть, изменения каким-либо образом) данных.

Чтобы изменить заголовок сообщения, вы можете использовать the_titleловушку фильтра, которая определяется следующим образом:

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

Это означает, что фильтр имеет тег / имя the_title, первый параметр $title- это данные, которые должны быть изменены (т. Е. Заголовок записи), а второй параметр $id- дополнительная информация (в данном случае идентификатор записи).

Например, чтобы отобразить заголовок каждого сообщения в UPPERCASE, вы можете использовать следующую строку:

add_filter('the_title', 'strtoupper');

Если мы посмотрим на add_filterфункцию, мы увидим, что она определяется следующим образом:

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

Мы указали только первый и второй (обязательный) параметр, в то время как третий и четвертый параметры установлены в соответствующие значения по умолчанию (т. Е. 10И 1).

Более сложный фильтр

Если вы хотите отфильтровать только определенный пост , вы можете использовать дополнительную информацию (в случае этого фильтра: идентификатор). Чтобы сделать это, вам нужно указать количество параметров (в данном случае это 2), а для того, чтобы сделать это снова, вам нужно указать параметр приоритета (который предшествует количеству аргументов).

Предположим, мы хотим повлиять только на заголовок поста с идентификатором 42, тогда он выглядит так:

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

В этом случае мы должны указать все четыре доступных параметра.

Какие параметры у меня есть?

Чтобы определить (количество) доступных параметров определенного фильтра, вы должны посмотреть, где он определен (в данном случае: здесь ).


Рекомендации :

tfrommen
источник
2
+1 за исчерпывающий ответ и безупречный класс (приятное форматирование).
Боско
Спасибо, это очень тщательно, но на самом деле не объясняет, о чем я спрашивал. например. разница между переменной $ value и переменной $ var в фильтре.
r00tAcc3ss
Хм, я бы сказал, так и есть, но это, конечно, мое субъективное чувство. Я добавлю немного информации о фильтре и его параметрах.
13