Хуки: действия и фильтры
Весь WordPress построен на хуках. Ядро в сотнях мест сообщает: «сейчас загрузятся скрипты», «запись сохранена», «вот текст статьи перед выводом». Ваш код подключается к этим точкам и меняет поведение сайта, не трогая ни одного файла ядра.
Действия
Действие — событие, к которому привязывают функцию:
// functions.php
add_action('wp_footer', function () {
echo '<p class="copyright">Сайт работает на WordPress</p>';
});Функция выполнится в тот момент, когда тема вызывает wp_footer().
Фильтры
Фильтр получает значение, изменяет его и обязан вернуть:
// functions.php
add_filter('the_title', function (string $title): string {
return mb_strtoupper($title);
});
add_filter('excerpt_length', fn () => 20);Первый фильтр переводит все заголовки в верхний регистр, второй задаёт длину краткого описания в 20 слов.
Чем они отличаются
| Действие | Фильтр | |
|---|---|---|
| Назначение | Что-то сделать | Что-то изменить |
| Возвращает значение | Нет | Обязательно |
| Подключение | add_action() | add_filter() |
| Вызов в ядре | do_action() | apply_filters() |
Приоритет и аргументы
Третий аргумент — приоритет: чем меньше число, тем раньше выполнится функция (по умолчанию 10). Четвёртый — сколько аргументов она принимает:
add_action('save_post', function (int $postId, WP_Post $post, bool $update) {
if ($update) {
error_log("Запись $postId изменена: {$post->post_title}");
}
}, 20, 3);Без четвёртого аргумента в функцию придёт только первый параметр.
Частые хуки
| Хук | Когда срабатывает |
|---|---|
after_setup_theme | Тема загружена — время объявить её возможности |
init | WordPress загружен — время регистрировать типы записей |
wp_enqueue_scripts | Подключение стилей и скриптов сайта |
admin_menu | Построение меню панели управления |
save_post | Запись сохранена |
wp_head, wp_footer | Вывод в head и перед </body> |
the_content (фильтр) | Текст записи перед выводом |
pre_get_posts | Перед основным запросом записей |
Удаление обработчика
Чужую функцию снимают с хука, указав те же имя и приоритет:
// functions.php
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'print_emoji_detection_script', 7);Первая строка убирает из страницы тег с версией WordPress.
Свои хуки
Тема или плагин могут создавать собственные точки расширения:
<?php
// single.php
do_action('mytheme_before_content');
the_content();
echo esc_html(apply_filters('mytheme_read_more_text', 'Читать дальше'));Теперь другой код — например, дочерняя тема — может добавить блок перед текстом или заменить надпись:
add_filter('mytheme_read_more_text', fn () => 'Подробнее →');Частая ошибка
Функция фильтра, которая забыла return, превращает значение в null: заголовки, тексты или ссылки просто исчезают со страницы. Фильтр всегда возвращает значение — даже если в этом случае менять его не нужно:
add_filter('the_content', function (string $content): string {
if (!is_single()) {
return $content;
}
return $content . '<p>Спасибо, что дочитали!</p>';
});