Хук 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. Анонимную функцию так снять не получится — на неё нет ссылки, поэтому в собственном коде для важных обработчиков лучше использовать именованные функции.

Обновлено:

Все термины раздела «WordPress»

Что будем искать? Например,Продвижение