Разница между add_filter и apply_filters

30 янв. 2014 г., 12:52:11
Просмотры: 34.8K
Голосов: 25

Я искал подходящее объяснение разницы между add_filter() и apply_filters(), но не смог найти.

Может кто-нибудь объяснить, какую информацию или логику следует учитывать при использовании add_filter или apply_filters в определенном контексте.

Что делает использование одной функции обязательным, а не другой?

  • Верно ли, что add_filter просто добавляет функцию в очередь функций, ожидающих выполнения для переменной, а apply_filters выполняет функции по порядку?

  • Также верно ли, что apply_filters при вызове с аргументом (именем функции для выполнения) выполнит эту функцию перед всеми остальными (если они существуют) в очереди?

3
Комментарии

Что в существующей документации здесь и здесь не объясняет это достаточно хорошо для вас?

t31os t31os
30 янв. 2014 г. 13:01:40

Я думаю, это действительно хороший вопрос. Для нового разработчика WordPress это может быть запутанной концепцией.

Shawn Shawn
29 сент. 2014 г. 21:00:59

Все когда-то были новичками.

Scott C Wilson Scott C Wilson
6 окт. 2024 г. 19:21:33
Все ответы на вопрос 2
1
33

Большая часть следующей информации может быть найдена в Кодексе:


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, и поэтому инициалы выводятся справа налево.

30 янв. 2014 г. 13:03:54
Комментарии

Это отличный ответ, который показывает, как можно переопределять фильтры. Спасибо.

Shawn Shawn
29 сент. 2014 г. 21:01:47
1

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

23 апр. 2023 г. 10:25:11
Комментарии

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

cjbj cjbj
26 апр. 2023 г. 12:25:48