Погружение в фильтры WordPress

Гибкость WordPress во многом держится на хуках. Фильтры – один из двух типов хуков: они пропускают данные через цепочку колбэков и позволяют менять результат без правок ядра. Заголовок, контент, меню, SQL-аргументы, HTML head – почти всё, что «выходит наружу», можно перехватить.

Что такое фильтр

Фильтр – точка, где ядро (или плагин) говорит: «вот значение, можете поправить». Вы подписываетесь на имя хука, получаете данные, возвращаете изменённые. Если забыли return – легко обнулить вывод. Это самое частое «почему пропал контент».

Как это устроено

В ядре вызывают apply_filters( 'hook_name', $value, ...$args ). Ваш код цепляется через add_filter(). Порядок выполнения задаёт приоритет (по умолчанию 10): меньше – раньше, больше – позже.

Полезные точки входа

  • the_content – HTML записи перед выводом.
  • the_title – заголовок.
  • the_excerpt – отрывок.
  • wp_nav_menu_items – пункты меню одним куском HTML/строки.
  • body_class / post_class – классы на body и записи.
  • upload_mimes – разрешённые типы файлов.

Минимальный пример

Добавим блок в конец каждой записи (лучше в плагин или child theme, не в правки родительской темы вслепую):

function krv_append_note_to_content( $content ) {
    if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
        return $content;
    }

    $note = '<p class="krv-note">Дополнение через фильтр the_content.</p>';
    return $content . $note;
}
add_filter( 'the_content', 'krv_append_note_to_content', 20 );

Приоритет 20 – после большинства «стандартных» обработчиков на 10. Условия is_singular / in_the_loop защищают от дублей в виджетах и списках.

Приоритет и число аргументов

Сигнатура add_filter( $hook, $callback, $priority = 10, $accepted_args = 1 ). Если хук передаёт два и больше аргумента, укажите $accepted_args, иначе PHP их просто не увидит:

add_filter( 'example_filter', 'krv_example', 10, 2 );
function krv_example( $value, $context ) {
    // $context доступен только если accepted_args >= 2
    return $value;
}

Отладка

Включите WP_DEBUG и лог на staging. Проверьте: правильное имя хука, уникальное имя функции, что колбэк реально подключён (не внутри условия, которое никогда не срабатывает), что вы возвращаете значение. Для инвентаризации «кто сидит на хуке» удобны Query Monitor и временный дамп $wp_filter['the_content'].

Практика без сюрпризов

  • Уникальные префиксы в именах функций/классов – меньше коллизий с плагинами.
  • Сначала условие (тип записи, роль, шаблон), потом изменение данных.
  • Всегда return. Фильтр – не action: «молча» ничего не печатать.
  • Без побочных эффектов: не слать письма и не писать в БД внутри фильтра вывода, если можно вынести в action.
  • Снимать хук через remove_filter() с тем же приоритетом, с которым добавляли.

Итог

Фильтры – основной способ менять данные WordPress «по правилам»: без форка ядра и без копипаста шаблонов на каждое чихание. Освойте add_filter / apply_filters, приоритеты и аккуратный return – и большая часть кастомизации станет предсказуемой, а не магией в functions.php.

Источники и ссылки


Комментарии загружаются…