Функция apply_filters() в WordPress: использование и примеры кода

APPLY_FILTERS() │ WP 0.71

Функция apply_filters() вызовет все функции, которые подключены к определенному фильтру.

Эта функция запускает все функции, связанные с фильтром (hook_name). Вы можете создавать новые фильтры просто вызывая эту функцию и указывая название нового фильтра через параметр (hook_name).

Кроме того, функция позволяет передавать несколько дополнительных аргументов к фильтрам.

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

// Функция обратного вызова для фильтра.
function example_callback( $string, $arg1, $arg2 ) {
    // (возможно) модифицируем $string.
    return $string;
}
add_filter( 'example_filter', 'example_callback', 10, 3 );

// Применение фильтров с вызовом функции 'example_callback()',
// которая подключена к 'example_filter' выше.
// 'example_filter' — это фильтр.
// 'filter me' — это значение, которое будет отфильтровано.
// $arg1 и $arg2 — дополнительные аргументы, передаваемые в функцию обратного вызова.
$value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );

Что возвращает?

Функция возвращает отфильтрованное значение после применения всех подключенных функций.

Синтаксис

apply_filters( $hook_name, $value, ...$args );

Параметры

  • $hook_name (string) (обязательный) — название фильтра.
  • $value (mixed) (обязательный) — значение, которое нужно отфильтровать.
  • ...$args (mixed) (необязательный) — дополнительные параметры, которые передаются в функции обратного вызова.

Примеры

1. Получение отфильтрованного значения

$value = apply_filters( 'filter_name', $value );

2. Добавление функции фильтра (этот код нужно выполнить до вызова apply_filters()):

add_filter( 'filter_name', 'filter_function' );

function filter_function( $value ){
    return $value;
}

3. Фильтрация значения и его отображение:

echo apply_filters( 'filter_name', $value );

4. Передача дополнительных аргументов в функцию фильтра:

$value = apply_filters( 'filter_name', 'filter me', 'arg1', 'arg2 ');

// Добавляем функцию фильтра с дополнительными аргументами:
add_filter( 'filter_name', 'filter_function', 10, 3 );

function filter_function( $value, $arg1, $arg2 ){
    return $value;
}

5. Пример вывода отформатированного содержимого через фильтр:

Это альтернатива функции the_content():

global $post;
echo apply_filters( 'the_content', $post->post_content );

Замечания

  • Глобальные переменные. $wp_filter[] – хранит все фильтры и действия.
  • Глобальные переменные. $wp_filters[] – хранит количество раз, когда каждый фильтр был вызван.
  • Глобальные переменные. $wp_current_filter[] – хранит список текущих фильтров, где последний — это текущий.

Изменения

  • С 0.71 — Введена функция.
  • С 6.0.0 — Формализован существующий и уже задокументированный параметр ...$args, добавленный в сигнатуру функции.

Код функции apply_filters

Функция apply_filters() находится в файле wp-includes/plugin.php и выглядит следующим образом:

function apply_filters( $hook_name, $value, ...$args ) {
    global $wp_filter, $wp_filters, $wp_current_filter;

    if ( ! isset( $wp_filters[ $hook_name ] ) ) {
        $wp_filters[ $hook_name ] = 1;
    } else {
        ++$wp_filters[ $hook_name ];
    }

    // Сначала выполняем все действия.
    if ( isset( $wp_filter['all'] ) ) {
        $wp_current_filter[] = $hook_name;

        $all_args = func_get_args(); 
        _wp_call_all_hook( $all_args );
    }

    if ( ! isset( $wp_filter[ $hook_name ] ) ) {
        if ( isset( $wp_filter['all'] ) ) {
            array_pop( $wp_current_filter );
        }

        return $value;
    }

    if ( ! isset( $wp_filter['all'] ) ) {
        $wp_current_filter[] = $hook_name;
    }

    // Передаем значение в WP_Hook.
    array_unshift( $args, $value );

    $filtered = $wp_filter[ $hook_name ]->apply_filters( $value, $args );

    array_pop( $wp_current_filter );

    return $filtered;
}

Связанные функции

  • add_filter() — добавляет функцию для обработки фильтра.
  • current_filter() — возвращает имя текущего фильтра.
  • doing_filter() — проверяет, выполняется ли фильтрация.
  • has_filter() — проверяет, есть ли фильтр с указанным именем.
  • remove_filter() — удаляет функцию фильтра.
  • remove_all_filters() — удаляет все функции фильтров.

Leave a Reply

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