Гибкость 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.
