Разница между add_filter и apply_filters
Я искал подходящее объяснение разницы между add_filter()
и apply_filters()
, но не смог найти.
Может кто-нибудь объяснить, какую информацию или логику следует учитывать при использовании add_filter
или apply_filters
в определенном контексте.
Что делает использование одной функции обязательным, а не другой?
Верно ли, что
add_filter
просто добавляет функцию в очередь функций, ожидающих выполнения для переменной, аapply_filters
выполняет функции по порядку?Также верно ли, что
apply_filters
при вызове с аргументом (именем функции для выполнения) выполнит эту функцию перед всеми остальными (если они существуют) в очереди?

Большая часть следующей информации может быть найдена в Кодексе:
apply_filters
Функции обратного вызова, прикрепленные к фильтру
$tag
, вызываются с помощью этой функции. Она также может использоваться для создания нового хука фильтра, просто вызвав ее с именем нового хука, указанным в параметре $tag.
$value = apply_filters( $tag, $value, $var_1, $var_2, ... );
По сути:
Вы используете apply_filters
для фильтрации заданного значения $value
— с учетом самого значения, а также опционально предоставленных переменных $var_1
до $var_n
.
add_filter
Привязывает функцию к определенному действию фильтра.
add_filter( $tag, $function_to_add, $priority, $accepted_args );
По сути:
Вы используете add_filter
для привязки пользовательской функции к заданному действию фильтра ($tag
), которое могло быть создано с помощью apply_filters
ранее (или это встроенный фильтр, или он происходит от плагина/вашей темы).
Вот вымышленный пример:
function print_initials( $name ) {
if ( ! is_string( $name ) ) {
return;
}
$fragments = explode( ' ', $name );
/**
* Фильтр, определяющий, печатать ли инициалы в обратном порядке.
*
* @param bool $reverse Печатать инициалы в обратном порядке?
*/
if ( apply_filters( 'reverse_initials', FALSE ) ) {
$fragments = array_reverse( $fragments );
}
foreach ( $fragments as $f ) {
echo substr( $f, 0, 1 );
}
}
print_initials( 'Some Guy' ); // выводит: SG
add_filter( 'reverse_initials', '__return_true' );
print_initials( 'Some Guy' ); // выводит: GS
Теперь, если мы просто вызовем нашу функцию как есть, инициалы будут выведены слева направо — потому что это поведение по умолчанию, которое мы определили.
Во второй раз мы получаем инициалы в обратном порядке — потому что функция фильтра __return_true
, привязанная к нашему действию фильтра, всегда возвращает TRUE
, и поэтому инициалы выводятся справа налево.

Приведённый выше пример — это классический пример, который может сбить с толку начинающего разработчика..
Грубо говоря, но понятным языком: вы можете использовать apply_filters
для создания собственного фильтра, который позже можно изменить через add_filter
.
С другой стороны, если вы используете уже готовый хук, вы можете сразу применить add_filter
.
Логика здесь — это типичная "нелогичность" разработки, поэтому вам нужно изучить больше примеров и немного попрактиковаться, чтобы "прочувствовать", как это работает..
Я понимаю, что даже моё объяснение может показаться не совсем понятным (и многие коллеги готовы прибить меня за неточность), но, на мой взгляд, это самое доступное объяснение, которое я встречал в интернете..

Это не является ответом на вопрос. Когда у вас будет достаточно репутации, вы сможете оставлять комментарии к любым сообщениям; вместо этого предоставляйте ответы, не требующие уточнений от автора вопроса. - Из обзора
