Проблемы с пониманием apply_filters()

26 апр. 2013 г., 17:40:50
Просмотры: 30.2K
Голосов: 21

В apply_filters()

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

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

0
Все ответы на вопрос 2
3
36

Попробуем рассмотреть функцию с более понятными именами:

apply_filters(
    $filter_name,     // используется для add_filter( $filter_name, 'callback' );
    $value_to_change, // единственная переменная, значение которой можно изменить
    $context_1,       // контекст
    $context_2        // дополнительный контекст
);

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

// wp-login.php строка 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;
}

Дополнительные переменные нужны для упрощения принятия решений, а не для их изменения.

26 апр. 2013 г. 17:54:24
Комментарии

Если я правильно понимаю. Мне не нужно добавлять переменную для сбора возвращаемого значения из apply_filters, так как оно автоматически применяется к $value_to_change?

r00tAcc3ss r00tAcc3ss
26 апр. 2013 г. 18:21:13

@r00tAcc3ss Ничего не происходит автоматически. Вам нужно изменить значение в вашей callback-функции. Вы также можете вернуть его без изменений, если хотите – в зависимости от контекста.

fuxia fuxia
26 апр. 2013 г. 18:33:53

Ах, да. Я имел в виду, что мне не нужно принимать возвращаемое значение в другую переменную и присваивать его $value. Это делается, если я изменяю $value в hooked-функции и возвращаю его, "автоматически".

r00tAcc3ss r00tAcc3ss
26 апр. 2013 г. 19:17:45
3
14

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

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

Подключение к фильтру

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

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

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

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

Например, для отображения заголовка каждой записи в ВЕРХНЕМ РЕГИСТРЕ можно использовать следующую строку:

add_filter('the_title', 'strtoupper');

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

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

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

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

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

Допустим, мы хотим изменить только заголовок записи с ID 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

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

Какие параметры доступны?

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


Ссылки:

26 апр. 2013 г. 18:27:54
Комментарии

+1 за развернутый ответ и безупречный стиль (отличное форматирование, брочачо)!

bosco bosco
26 апр. 2013 г. 18:41:58

Спасибо, это очень подробно, но не совсем объясняет то, о чем я спрашивал. Например, разницу между переменной $value и $var в фильтре.

r00tAcc3ss r00tAcc3ss
26 апр. 2013 г. 19:20:54

Хм, я бы сказал, что объясняет, но это, конечно, мое субъективное ощущение. Тем не менее, я добавлю немного информации о фильтре и его параметрах.

tfrommen tfrommen
26 апр. 2013 г. 19:24:36