Функция DOING_FILTER() в WordPress: зачем нужна и как использовать

Функция DOING_FILTER() │ WP 3.9.0

Функция doing_filter() позволяет узнать, какой фильтр в данный момент обрабатывается в WordPress.

Зачем нужна эта функция?

  • Функция current_filter() возвращает только самый последний фильтр, который выполняется.
  • Функция did_filter() сообщает, сколько раз фильтр был применён за текущий запрос.

С помощью doing_filter() вы можете определить, выполняется ли какой-либо фильтр в данный момент, независимо от того, является ли он последним в очереди.

Примеры использования

Синтаксис

doing_filter( $hook_name );
  • $hook_name (string|null) — имя фильтра, которое нужно проверить. По умолчанию null, что означает проверку на наличие любого выполняемого фильтра.

Возвращаемое значение

  • Возвращает true или false. true, если фильтр в данный момент выполняется.

Примеры работы

Пример 1: Проверка фильтра в действии

add_action( 'wp_head', function() {
    doing_filter( 'wp_head' ); //> true
    var_dump( doing_filter('wp_head') );
    die;
});

Результат: Когда срабатывает действие wp_head, WordPress остановит выполнение, и на экран выведется bool(true).

Пример 2: Разные действия с одинаковым обработчиком

add_filter( 'wp_mail_from', 'filter_system_from_mail' );
add_filter( 'wp_mail_from_name', 'filter_system_from_mail' );

function filter_system_from_mail() {
    if( doing_filter('wp_mail_from') )
        $opt_name = 'admin_email';
    else
        $opt_name = 'blogname';

    return get_option( $opt_name );
}

В этом примере функция filter_system_from_mail() изменяет адрес отправителя электронных писем в зависимости от того, какой фильтр был вызван.

Пример 3: Проверка родительского фильтра

add_filter( 'foo_filter', 'foo_filter_function' );
add_filter( 'bar_filter', 'bar_filter_function' );

echo apply_filters( 'foo_filter', 'Hello' ); //> Hello world!

function foo_filter_function( $text ) {
    return apply_filters( 'bar_filter', $text );
}

function bar_filter_function( $text ) {
    if( doing_filter('foo_filter') && doing_filter('bar_filter') ){
        return "$text world!";
    }
    return 'Noooop!';
}

В этом примере показано, как doing_filter() может проверить, выполняются ли оба фильтра foo_filter и bar_filter одновременно.

Заметки

  • Свидетельствующие функции:
    • current_filter()
    • did_filter()
  • Глобальная переменная: $wp_current_filter — массив текущих фильтров.

История изменений

  • Функция doing_filter() была введена в версии 3.9.0.

Код функции

function doing_filter( $hook_name = null ) {
    global $wp_current_filter;

    if ( null === $hook_name ) {
        return ! empty( $wp_current_filter );
    }

    return in_array( $hook_name, $wp_current_filter, true );
}

С помощью этой функции вы можете легко проверять, какие фильтры активны в вашем проекте на WordPress.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *