Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Хуки: действия и фильтры

Весь 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Тема загружена — время объявить её возможности
initWordPress загружен — время регистрировать типы записей
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>';
});

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.