Хуки — основа архитектуры WordPress. Они позволяют изменять поведение ядра, тем и плагинов без редактирования их файлов. Понимание хуков — обязательный навык для любого WordPress-разработчика.
Два типа хуков
- Actions (действия) — выполняют код в определённый момент. Не возвращают значение.
- Filters (фильтры) — изменяют данные перед их использованием. Обязательно возвращают значение.
add_action — подключение к событию
add_action( string $hook, callable $callback, int $priority = 10, int $accepted_args = 1 );
Пример: добавить скрипт на страницу
add_action( "wp_enqueue_scripts", function() {
wp_enqueue_script(
"my-script",
get_template_directory_uri() . "/js/main.js",
[ "jquery" ],
"1.0.0",
true
);
} );
Пример: отправить уведомление после публикации поста
add_action( "publish_post", function( int $post_id, WP_Post $post ) {
$admin_email = get_option( "admin_email" );
wp_mail( $admin_email, "Новый пост: " . $post->post_title, "Опубликован новый пост." );
}, 10, 2 );
add_filter — изменение данных
add_filter( string $hook, callable $callback, int $priority = 10, int $accepted_args = 1 );
Пример: изменить длину анонса
add_filter( "excerpt_length", function( int $length ): int {
return 30;
} );
Пример: добавить класс к тегу body
add_filter( "body_class", function( array $classes ): array {
if ( is_singular( "post" ) ) {
$classes[] = "single-article";
}
return $classes;
} );
Пример: изменить заголовок письма WordPress
add_filter( "wp_mail_from_name", function(): string {
return get_bloginfo( "name" );
} );
add_filter( "wp_mail_from", function(): string {
return "noreply@" . parse_url( home_url(), PHP_URL_HOST );
} );
Приоритет: кто выполняется первым
Чем меньше число — тем раньше выполняется колбэк. По умолчанию — 10.
// Выполнится раньше add_filter( "the_title", "my_early_filter", 5 ); // Выполнится позже add_filter( "the_title", "my_late_filter", 20 );
remove_action и remove_filter — отключение хука
// Отключить автоматические смайлики WordPress remove_action( "wp_head", "print_emoji_detection_script", 7 ); remove_action( "wp_print_styles", "print_emoji_styles" ); // Отключить фильтр — нужен тот же приоритет, что и при добавлении remove_filter( "the_content", "wpautop" );
do_action и apply_filters — создание собственных хуков
// В своём плагине/теме создаём точку расширения
function my_plugin_process_order( int $order_id ): void {
// ... логика ...
// Даём другим плагинам возможность вмешаться
do_action( "my_plugin/order_processed", $order_id );
}
// Другой плагин подключается к этому хуку
add_action( "my_plugin/order_processed", function( int $order_id ) {
// Отправить SMS, обновить CRM и т.д.
} );
Полезные хуки ядра WordPress
| Хук | Тип | Когда срабатывает |
|---|---|---|
| init | action | После загрузки WordPress, до отправки заголовков |
| wp_enqueue_scripts | action | Для подключения JS/CSS на фронте |
| admin_enqueue_scripts | action | Для подключения JS/CSS в админке |
| save_post | action | При сохранении любого типа записи |
| the_content | filter | Перед выводом содержимого поста |
| the_title | filter | Перед выводом заголовка поста |
| login_redirect | filter | После успешной авторизации |
| upload_mimes | filter | Список разрешённых типов файлов |
Итог
Правило простое: нужно выполнить код — используйте add_action. Нужно изменить данные — используйте add_filter и не забывайте возвращать значение. Создавайте свои хуки в плагинах и темах — это делает код расширяемым без правки исходников.
