Хуки WordPress. Что это такое и как ими пользоваться

markelov666

Умник
Хуки WordPress. Что это такое и как ими пользоваться​

Если вы занимаетесь разработкой на WordPress, то рано или поздно постоянно будете сталкиваться с хуками. Без них практически невозможно нормально работать с темами, плагинами и самим WordPress.

На первый взгляд хуки могут показаться чем-то сложным. На самом деле идея довольно простая. WordPress в определенных местах останавливается и дает нам возможность выполнить свой код или изменить какие-то данные.

В этой статье разберу, что такое хуки, какие они бывают, как их использовать и покажу несколько примеров из реальной разработки.


Что такое хук в WordPress
Хук можно представить как заранее подготовленную точку в коде WordPress, куда мы можем подключить свою функцию.

Например, WordPress создает новую запись. В процессе этого происходит много разных действий. В какой-то момент WordPress вызывает определенный хук, а мы можем сказать ему
PHP:
add_action( 'save_post', 'my_save_post' );

Теперь при сохранении записи WordPress вызовет нашу функцию.
PHP:
function my_save_post( $post_id ) {
    // Здесь выполняем свой код
}

Сам WordPress при этом менять не нужно. Мы просто подключаемся к уже существующему процессу.

Именно поэтому хуки настолько важны. Можно расширять WordPress, не изменяя файлы ядра.

Хуки используются не только в WordPress Core. Их активно используют темы и плагины, а разработчик своего плагина или темы тоже может создавать собственные хуки.


Какие бывают хуки
В WordPress есть два основных типа хуков
  • Actions
  • Filters
Разница между ними довольно простая.

Action нужен, когда мы хотим что-то выполнить в определенный момент.

Filter нужен, когда мы хотим получить какие-то данные, изменить их и вернуть обратно.


Actions
Action можно воспринимать как событие.

Например, WordPress говорит

Запись сейчас сохраняется

Мы можем подключиться к этому моменту и выполнить свой код.

Самый простой пример:
PHP:
function my_function() {
    error_log( 'Сработал хук init' );
}

add_action( 'init', 'my_function' );

Когда WordPress дойдет до init, будет вызвана наша функция.

На практике init используется очень часто. Например, на нем можно регистрировать свои типы записей, таксономии и выполнять другую инициализацию.
PHP:
function register_my_post_type() {
    register_post_type( 'product', [
        'public' => true,
        'label'  => 'Products',
    ] );
}

add_action( 'init', 'register_my_post_type' );

Здесь мы говорим WordPress, что при наступлении init нужно вызвать нашу функцию и зарегистрировать тип записи product.


Еще один пример с Action
Допустим, нам нужно добавить какой-то HTML перед футером сайта.

Можно использовать wp_footer.
PHP:
function my_footer_message() {
    echo '<p>Мой текст в футере</p>';
}

add_action( 'wp_footer', 'my_footer_message' );

Теперь перед закрытием футера WordPress вызовет нашу функцию.

Так можно добавлять HTML, подключать какую-то логику, отправлять данные и выполнять другие действия.

Конкретное поведение зависит от самого хука.


Filters
С фильтрами немного интереснее.

Представим, что WordPress передает нам заголовок записи. Мы можем его изменить и вернуть обратно.

Например:
PHP:
function my_change_title( $title ) {
    return 'Товар ' . $title;
}

add_filter( 'the_title', 'my_change_title' );

Если заголовок был

Кресло офисное

после фильтра он станет

Товар Кресло офисное

Главное отличие от Action здесь в том, что Filter должен вернуть измененное значение.

return $title;

Если забыть return, можно получить совсем не тот результат, который ожидался.

Официальная документация WordPress также отдельно отмечает, что фильтры предназначены именно для изменения данных и не должны использоваться для побочных действий вроде вывода информации или изменения глобального состояния.


Action и Filter на простом примере
Я обычно объясняю разницу примерно так.

Action
PHP:
add_action( 'some_hook', 'my_function' );

WordPress говорит

Сейчас произошло событие. Можешь что-нибудь сделать.

Filter
PHP:
add_filter( 'some_hook', 'my_function' );

WordPress говорит

Вот данные. Можешь их изменить и вернуть обратно.

Поэтому если нам нужно выполнить какое-то действие, чаще всего нужен Action.

Если нужно изменить существующее значение, чаще всего нужен Filter.


Как подключается функция к хуку
Для этого используются две основные функции
PHP:
add_action();
add_filter();

Например:
PHP:
add_action( 'init', 'my_function' );

или
PHP:
add_filter( 'the_content', 'my_function' );

Первым параметром передается название хука, вторым наша функция.

Причем callback может быть не только обычной функцией. Можно использовать методы классов и анонимные функции.


Приоритет хуков
У хуков есть еще один важный параметр, который часто встречается в реальных проектах.

Например:
PHP:
add_action( 'init', 'my_function', 20 );

Здесь 20 это приоритет.

По умолчанию WordPress использует приоритет 10.

Если к одному хуку подключено несколько функций, WordPress выполняет их в зависимости от приоритета. Чем меньше число, тем раньше будет выполнена функция.

Например:
PHP:
add_action( 'init', 'function_one', 10 );
add_action( 'init', 'function_two', 20 );
add_action( 'init', 'function_three', 30 );

Порядок будет таким:
function_one
function_two
function_three

Если поставить приоритет 5, функция выполнится раньше функции с приоритетом 10.
PHP:
add_action( 'init', 'function_one', 5 );

Это особенно полезно, когда несколько плагинов или частей темы работают с одним и тем же хуком.

В официальной документации также указано, что если несколько callback имеют одинаковый приоритет, они выполняются в порядке добавления.


Сколько аргументов можно получить
Иногда хук передает в нашу функцию дополнительные данные.

Например, save_post может передать ID записи, объект записи и информацию о том, является ли это обновлением.

Можно написать так:
PHP:
function my_save_post( $post_id, $post, $update ) {
    // Работаем с записью
}

add_action( 'save_post', 'my_save_post', 10, 3 );

Здесь последний параметр 3 говорит WordPress, что наша функция хочет получить три аргумента.

Это важный момент.

Если хук передает несколько аргументов, нужно указать их количество при подключении функции.
PHP:
add_action( 'save_post', 'my_save_post', 10, 3 );

А для фильтра принцип тот же
PHP:
add_filter( 'some_filter', 'my_filter', 10, 2 );

При этом у Filter только первое значение является тем, которое можно изменить и вернуть. Остальные аргументы обычно нужны для дополнительной информации.


Как удалить свой или чужой хук
Иногда нужно не добавить свою функцию, а наоборот убрать функцию, которую уже добавил WordPress, тема или плагин.

Для этого есть:
PHP:
remove_action();
remove_filter();

Например:
PHP:
remove_action( 'wp_footer', 'my_footer_message' );

Но тут есть важный момент. Чтобы удалить callback, параметры должны совпадать с теми, с которыми он был добавлен, включая приоритет.

Например, если было:
PHP:
add_action( 'wp_footer', 'my_footer_message', 20 );

то удалять нужно так:
PHP:
remove_action( 'wp_footer', 'my_footer_message', 20 );

Это часто встречается при кастомизации WooCommerce и WordPress тем.


Хуки в WooCommerce
Если вы работаете с WooCommerce, то без хуков вообще никуда.

WooCommerce предоставляет огромное количество собственных Actions и Filters.

Например, можно добавить информацию на страницу товара
PHP:
add_action( 'woocommerce_single_product_summary', 'my_product_text', 25 );

function my_product_text() {
    echo '<p>Дополнительная информация</p>';
}

Число 25 здесь тоже является приоритетом.

Можно изменить цену товара
PHP:
add_filter( 'woocommerce_get_price_html', 'my_price_html' );

function my_price_html( $price ) {
    return $price . ' за штуку';
}

Или изменить текст кнопки
PHP:
add_filter( 'woocommerce_product_single_add_to_cart_text', 'my_button_text' );

function my_button_text() {
    return 'Добавить в корзину';
}

На практике большая часть кастомизации WooCommerce как раз строится на хуках.


Где искать нужный хук
Вот здесь начинаются самые интересные моменты.

Когда нужно что-то изменить в WordPress, не стоит сразу открывать файл темы и переписывать его.

Сначала я бы поискал подходящий хук.

Самый удобный вариант это официальная документация WordPress.

В ней есть отдельные страницы для конкретных хуков. Например, для current_screen можно посмотреть, когда именно он вызывается, какие аргументы получает и где находится в исходном коде WordPress.

Еще один вариант это поиск по исходникам.

Если видим
PHP:
do_action( 'some_action', $value );

значит перед нами Action.

Если видим
PHP:
$value = apply_filters( 'some_filter', $value );

значит перед нами Filter.

Это один из самых полезных навыков при работе с WordPress. Если понимать do_action() и apply_filters(), искать нужные хуки становится намного проще.


Можно создавать свои хуки
Хуки нужны не только для WordPress Core.

Если мы пишем свой плагин или сложную тему, можно создавать собственные точки расширения.

Например:
PHP:
do_action( 'my_custom_action' );

Теперь другой разработчик может подключиться к этому месту:
PHP:
add_action( 'my_custom_action', 'my_function' );

С фильтрами аналогично:
PHP:
$title = apply_filters( 'my_custom_title', $title );

Другой разработчик сможет изменить значение:
PHP:
add_filter( 'my_custom_title', 'change_my_title' );

function change_my_title( $title ) {
    return 'Новый ' . $title;
}

Это особенно полезно при разработке собственных плагинов. Благодаря этому не приходится изменять исходный код плагина, если кому-то понадобится его расширить.

WordPress рекомендует добавлять собственные хуки в плагины именно для таких случаев. Это позволяет другим разработчикам расширять функциональность без копирования и изменения исходного проекта.


Что изменилось в современных версиях WordPress
Сами Actions и Filters никуда не делись. Наоборот, система хуков продолжает активно использоваться и развивается вместе с WordPress.

Например, в WordPress 6.9 появилось 21 новый Action и Filter. Среди них есть хуки, связанные с шаблонами, блоками, Block Bindings и другими частями системы.

В этой же версии появился новый Abilities API. Для него также добавили собственные хуки, например wp_abilities_api_init, wp_before_execute_ability и wp_after_execute_ability.

То есть даже с появлением новых API старая система хуков остается важной частью архитектуры WordPress.

Есть и хорошая новость для разработчиков. В 2026 году официальная документация WordPress была обновлена до версии 6.9.1 после длительного периода без полноценного обновления Reference. Поэтому сейчас искать актуальную информацию по хукам в официальной документации стало значительно удобнее.


Частая ошибка начинающих
Одна из самых распространенных ошибок это пытаться изменить файлы WordPress Core.

Например, человек хочет поменять какой-то стандартный текст и идет прямо в wp-includes.

Это плохая идея.

После обновления WordPress все изменения пропадут.

Если для нужной задачи есть подходящий хук, лучше использовать его.

То же самое относится к плагинам. Если можно изменить поведение WooCommerce через Filter или Action, обычно лучше сделать это через functions.php, собственный плагин или отдельный функциональный модуль.


Еще одна важная вещь
Не стоит использовать хуки просто потому, что они существуют.

Иногда можно увидеть код, где одна функция цепляется на init, внутри нее выполняется половина логики сайта, а потом удивляться, почему проект становится сложно поддерживать.

Хук должен решать конкретную задачу.

Например:
PHP:
add_action( 'init', 'register_my_post_type' );

Для регистрации типа записи это нормально.

А вот если на init мы начинаем делать запросы к базе, обрабатывать товары, отправлять письма и менять HTML сайта, скорее всего, стоит пересмотреть архитектуру.

Также нужно учитывать приоритеты и количество аргументов. Это небольшие детали, но именно из-за них иногда приходится долго искать причину ошибки.


Как я обычно работаю с хуками
Когда нужно что-то изменить в WordPress, я обычно иду примерно по такому пути.

Сначала определяю, что именно нужно изменить.

Если нужно что-то выполнить в определенный момент, ищу Action.

Если нужно изменить существующие данные, ищу Filter.

После этого смотрю документацию и проверяю, какие аргументы передает хук.

Потом подключаю небольшую отдельную функцию.

Например:
PHP:
add_filter( 'the_title', 'my_change_title' );

function my_change_title( $title ) {
    if ( is_admin() ) {
        return $title;
    }

    return 'Товар ' . $title;
}

И только после этого уже усложняю код, если действительно нужно.


Итог
Хуки это одна из главных вещей, которую нужно понимать при разработке под WordPress.

Если коротко, то Action позволяет выполнить свой код в определенный момент, а Filter позволяет изменить данные перед тем, как WordPress продолжит работу с ними.

Основные функции, которые стоит запомнить:
PHP:
add_action();
add_filter();

remove_action();
remove_filter();

do_action();
apply_filters();

Когда начинаешь хорошо понимать хуки, WordPress становится намного понятнее. Многие задачи, которые сначала выглядят как необходимость переписывать шаблон или лезть в ядро, решаются буквально несколькими строками PHP.

И самое главное, что этот подход остается актуальным и в современных версиях WordPress. Core продолжает добавлять новые точки расширения, а Actions и Filters по-прежнему являются одной из основных возможностей для расширения WordPress.

Если вы только начинаете разбираться в WordPress, я бы советовал не пытаться сразу выучить сотни хуков. Лучше понять сам принцип работы. После этого нужный хук обычно уже можно найти в документации или непосредственно в исходниках WordPress.
 
Последнее редактирование:
  • Нравится
Реакции: UPC
Сверху Снизу