Проблемы с пониманием apply_filters()
В apply_filters()
apply_filters( $tag, $value, $var ... );
У меня возникли сложности с пониманием параметров $value
и $var
. Я прочитал документацию, и там говорится, что $value
может быть изменен, а $var
нет, но я не нашел примеров этого в реальном коде. Похоже, что это используется как способ передачи переменной. В таком случае, в чем разница между этим и параметром $var
?
Попробуем рассмотреть функцию с более понятными именами:
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;
}
Дополнительные переменные нужны для упрощения принятия решений, а не для их изменения.

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

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

Что такое фильтры?
Фильтры — это функции, через которые 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
В этом случае необходимо указать все четыре доступных параметра.
Какие параметры доступны?
Чтобы определить количество доступных параметров для определенного фильтра, нужно посмотреть, где он определен (в данном случае: здесь).
Ссылки:

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

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