Різниця між add_filter та apply_filters


17

Я шукав відповідне пояснення різниці між add_filter()і apply_filters()тут, але не зміг його знайти.

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

Що робить використання одного імперативом, а не іншого?

  • Чи правильно, що add_filterпросто додає функцію до черги функцій, які чекають виконання на змінній та apply_filtersвиконує функції в порядку?

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


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і, таким чином, робить ініціали виведення справа наліво.


3
Це чудова відповідь і показує, як можна переосмислити фільтри. Спасибі.
Шон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.