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

17

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

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

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

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

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

hanachi
источник
2
А как насчет существующей документации здесь и здесь не объясняет это адекватно для вас?
t31os
3
Я думаю, что это на самом деле хороший вопрос. В качестве нового разработчика WordPress это может привести к путанице.
Шон,

Ответы:

26

Большинство из следующего можно найти в Кодексе :


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 );

    /**
     * Filter wether to print initials in reverse order.
     *
     * @param bool $reverse Print initials in reverse order?
     */
    if ( apply_filters( 'reverse_initials', FALSE ) ) {
        $fragments = array_reverse( $fragments );
    }

    foreach ( $fragments as $f ) {
        echo substr( $f, 0, 1 );
    }
}

print_initials( 'Some Guy' ); // outputs: SG

add_filter( 'reverse_initials', '__return_true' );

print_initials( 'Some Guy' ); // outputs: GS

Теперь, если мы просто вызываем нашу функцию как есть, инициалы печатаются слева направо, потому что это то, что мы определили как поведение по умолчанию.

Во второй раз мы получаем инициалы в обратном порядке - потому что функция фильтра __return_true, которая подключена к нашему действию фильтра, всегда возвращает TRUEи, таким образом, выводит инициалы справа налево.

tfrommen
источник
3
Это отличный ответ и показывает, как вы можете переопределить фильтры. Благодарю.
Шон