Разница между 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.
Логика здесь — это типичная "нелогичность" разработки, поэтому вам нужно изучить больше примеров и немного попрактиковаться, чтобы "прочувствовать", как это работает..
Я понимаю, что даже моё объяснение может показаться не совсем понятным (и многие коллеги готовы прибить меня за неточность), но, на мой взгляд, это самое доступное объяснение, которое я встречал в интернете..
Это не является ответом на вопрос. Когда у вас будет достаточно репутации, вы сможете оставлять комментарии к любым сообщениям; вместо этого предоставляйте ответы, не требующие уточнений от автора вопроса. - Из обзора
cjbj