Хуки WordPress: как работают add_action и add_filter, примеры на PHP

Хуки — основа архитектуры 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 и не забывайте возвращать значение. Создавайте свои хуки в плагинах и темах — это делает код расширяемым без правки исходников.