Как применить фильтр ко всему?

Вопрос или проблема

Я хочу применить фильтр ко всему.

add_filter(‘the_content’, word_swap);

Есть ли термин, которым я могу заменить the_content, чтобы целиться на все функции?

Функции “фильтровать всё” не существует.

WordPress делает что-то с их функцией capital_P_dangit(), которая прикрепляется к ‘the_title’, ‘the_content’ и ‘comment_text’. https://developer.wordpress.org/reference/functions/ capital_p_dangit/

Посмотрите на решение kfriend здесь… оно работает. Не уверен, несет ли это какие-то другие риски, но это работает.

https://stackoverflow.com/questions/772510/wordpress-filter-to-modify-final-html-output

Вы можете практически заменять что угодно на что угодно, используя это.

Существует предопределенный фильтр “all”, который вы можете использовать, как
add_filter('all', 'word_swap');

Функция word_swap, которую вы передаете как обратный вызов, будет принимать тег фильтра (название фильтра) в качестве первого аргумента, а второй аргумент будет значением. Аргумент значения может быть пропущен для некоторых фильтров, таких как “shutdown”, поэтому он должен иметь значение по умолчанию.

function word_swap($tag, $value = null){
    // измените значение так, как вам нужно здесь
    return $changed_value;
}

Пример использования 1:
Чтобы ограничить выполнение вашей функции word_swap для некоторых тегов фильтра, вы можете держать массив тегов для исключения.

function get_tags_to_exclude(){
    return ['some_filter_to_exclude_1', 'some_filter_to_exclude_2'];
}
function word_swap($tag, $value = null){
    if( in_array( $tag, get_tags_to_exclude() ) ){
        return $value;
    }
    // выполняйте здесь все, что хотите
    return changed_value;
}

Пример использования 2:
Чтобы разрешить выполнение вашей функции word_swap только для некоторых тегов фильтра, вы можете держать массив разрешенных тегов.

function get_tags_to_allow(){
    return ['some_filter_to_allow_1', 'some_filter_to_allow_2'];
}
function word_swap($tag, $value = null){
    if( !in_array( $tag, get_tags_to_allow() ) ){
        return $value;
    }
    // выполняйте здесь все, что хотите
    return changed_value;
}

Если вы хотите, чтобы ваш фильтр вызывался только в некоторых случаях, тогда лучше использовать add_filter один за другим, как

add_filter('tag1', 'word_swap');
add_filter('tag2', 'word_swap');

Таким образом, пример 2 – плохой пример использования, если ваш массив разрешенных фильтров не содержит почти всех фильтров.

Но если вы ДЕЙСТВИТЕЛЬНО хотите, чтобы ваш фильтр вызывался практически во всех случаях (может быть, исключая некоторые из них), или если вы хотите сделать что-то на этапе разработки, например, отслеживать выполнение фильтра, то это нормально.

Фильтр “all” всегда выполняется перед самим фильтром, так что если есть такой код

add_filter('all', 'word_swap');
add_filter('some_filter', 'other_function');

ваша функция word_swap всегда будет вызываться перед other_function. Вы даже можете использовать add_filter внутри вашей функции word_swap, как это.

function get_tags_to_exclude(){
    return ['some_filter_to_exclude_1', 'some_filter_to_exclude_2'];
}
function word_swap_wrapper($tag, $value = null){
    add_filter($tag, 'word_swap');
    return $value;
}
add_filter('all', 'word_swap_wrapper');
function word_swap($value = null){
    if( in_array( $tag, get_tags_to_exclude() ) ){
        return $value;
    }
    // выполняйте здесь все, что хотите
    return changed_value;
}

Я полагаю, вы этого не хотите, если собираетесь фильтровать абсолютно все.
Если вы хотите, чтобы ваша функция word_swap работала после выполнения всех остальных обратных вызовов, вы можете использовать приоритет, как это:

function get_tags_to_exclude(){
    return ['some_filter_to_exclude_1', 'some_filter_to_exclude_2'];
}
function word_swap_wrapper($tag, $value = null){
    add_filter($tag, 'word_swap', PHP_INT_MAX);
    return $value;
}
add_filter('all', 'word_swap_wrapper');
function word_swap($value = null){
    if( in_array( $tag, get_tags_to_exclude() ) ){
        return $value;
    }
    // выполняйте здесь все, что хотите
    return changed_value;
}

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

Давайте посмотрим на функцию word_swap_wrapper, она будет регистрировать функцию word_swap каждый раз для каждого тега, чтобы ограничить это мы можем проверить это перед регистрацией word_swap для того же тега снова и снова.
Итак, финальное решение будет таким:

function get_tags_to_exclude(){
    return ['some_filter_to_exclude_1', 'some_filter_to_exclude_2'];
}
function word_swap_wrapper($tag, $value = null){
    static $lookup;
    if(!$lookup){
        $lookup = [];
    } elseif( !isset($lookup[ $tag ]) ){
        $lookup[ $tag ] = true;
        add_filter($tag, 'word_swap', PHP_INT_MAX);
    }
    return $value;
}
add_filter('all', 'word_swap_wrapper');
function word_swap($value = null){
    if( in_array( $tag, get_tags_to_exclude() ) ){
        return $value;
    }
    // выполняйте здесь все, что хотите
    return changed_value;
}

Вы можете найти неполный список предопределенных фильтров WordPress здесь
и здесь

.

Ответ или решение

Конечно, давайте разберемся с вопросом о применении фильтра ко всему в контексте WordPress.

Описание задачи

Задача пользователя состоит в том, чтобы применить функцию, например, word_swap, ко всем возможным фильтрам в WordPress. Обычно в WordPress можно подключать функции к конкретным фильтрам с помощью add_filter('the_content', 'word_swap');. В данном случае, пользователь хотел бы подключить функцию к каждому возможному фильтру, чтобы провести обработку таким образом, чтобы она затрагивала все данные, проходящие через систему фильтров.

Как применить фильтр ко всему

Основная концепция заключается в использовании специального предопределенного фильтра – ‘all’. Эта функция позволяет подключиться ко всем вызовам других фильтров в WordPress. Однако важно понимать, что подключение функции к ‘all’ может оказывать значительную нагрузку на систему, поскольку каждая обработка может потребовать дополнительных вычислительных ресурсов.

Применение фильтра ‘all’

function word_swap($tag, $value = null){
    // Здесь вы реализуете необходимую логику для обработки $value
    return $измененное_значение;
}

add_filter('all', 'word_swap');

Ограничение фильтров

Иногда может понадобиться ограничить действие вашего фильтра. Вы можете исключить определенные фильтры из обработки либо включить только некоторые опредленные с помощью условий in_array().

Исключение фильтров

function get_tags_to_exclude(){
    return ['some_filter_to_exclude_1', 'some_filter_to_exclude_2'];
}

function word_swap($tag, $value = null){
    if( in_array($tag, get_tags_to_exclude()) ){
        return $value;
    }
    // здесь выполняется основная логика
    return $измененное_значение;
}

Включение только определенных фильтров

function get_tags_to_allow(){
    return ['some_filter_to_allow_1', 'some_filter_to_allow_2'];
}

function word_swap($tag, $value = null){
    if( !in_array($tag, get_tags_to_allow()) ){
        return $value;
    }
    // здесь выполняется основная логика
    return $измененное_значение;
}

Заключение

Использование фильтра ‘all’ в WordPress предоставляет мощный механизм для проведения комплексной обработки данных. Тем не менее, следует помнить о последствиях такого подхода, учитывая потенциальную нагрузку и возможные конфликты. Целесообразно протестировать вашу логику обработки в безопасной среде перед внедрением в производственную систему.

Эта информация должна помочь вам эффективно использовать WordPress фильтры и избегать проблем, связанных с их избыточным использованием.

Оцените материал
Добавить комментарий

Капча загружается...