Хук WordPress
Оригинальное название: WordPress hook
Коротко
Именованная точка в коде WordPress, к которой плагин или тема могут подключить свою функцию. Так меняют поведение сайта без правки файлов ядра.
Что такое «Хук WordPress»
Ядро WordPress во время работы постоянно «объявляет» о происходящем: загрузились плагины, начинается вывод шапки, сохраняется запись, готовится текст к показу. В каждом таком месте стоит вызов do_action() или apply_filters() с собственным именем. Любой код может заранее подписаться на это имя и выполниться в нужный момент. Благодаря этому обновление WordPress не стирает доработки: они живут в плагине или теме, а не в файлах ядра.
Хуки бывают двух видов. Действия запускают код в определённый момент и ничего не возвращают. Фильтры получают значение, позволяют его изменить и обязаны вернуть результат.
Как устроено внутри
Все подписки хранятся в глобальном массиве $wp_filter: для каждого имени хука — объект класса WP_Hook со списком функций, разложенных по приоритетам. Приоритет по умолчанию — 10, меньшее число выполняется раньше. Когда срабатывает хук, WordPress проходит функции по порядку. Действия и фильтры технически используют одно хранилище, поэтому add_action() — по сути обёртка над add_filter().
Пример: своя точка расширения
// в своём плагине магазина
do_action( 'myshop_order_paid', $order_id, $amount );
// в другом плагине или теме
add_action( 'myshop_order_paid', function ( $order_id, $amount ) {
error_log( "Заказ {$order_id} оплачен на сумму {$amount}" );
}, 10, 2 );
Четвёртый аргумент 2 говорит, сколько параметров передать функции. Хорошая практика — добавлять такие точки в собственный код: тогда его можно расширять, не переписывая.
Как найти и убрать чужой обработчик
Список хуков ядра есть в справочнике разработчика на developer.wordpress.org, а плагин Query Monitor показывает, какие хуки сработали на текущей странице и кто на них подписан. Чтобы отключить чужую функцию, вызывают remove_action() или remove_filter() с тем же именем хука, той же функцией и тем же приоритетом. Например, remove_action( 'wp_head', 'wp_generator' ); убирает из кода страницы метатег с версией WordPress. Анонимную функцию так снять не получится — на неё нет ссылки, поэтому в собственном коде для важных обработчиков лучше использовать именованные функции.

