Хуки в WordPress: как стать повелителем кода, не прикасаясь к ядру

Вы хотите изменить поведение темы или плагина, но боитесь лезть в их код, потому что после обновления все правки пропадут? Или вам нужно добавить небольшую функцию, но не хотите создавать для этого целый плагин? Знакомьтесь с системой хуков (hooks) WordPress — её главным архитектурным гением. Хуки — это «точки подвеса», куда вы можете «подцепить» свой код, чтобы изменить что угодно: от текста в футере до сложной логики оформления заказа. Это безопасно, элегантно и профессионально. Давайте разберём, как мыслить категориями хуков и управлять своим сайтом на уровне кода, не ломая его.


Часть 1: Actions и Filters: В чём разница? (Простая аналогия)

Представьте, что WordPress — это конвейер по сборке автомобиля (страницы).

  • Action (Действие) — это момент времени на конвейере, когда вы можете что-то сделать. Например, «после установки сиденья» (хук after_setup_theme) или «перед покраской кузова» (хук wp_head). Action ничего не возвращает, он просто выполняет ваш код в нужный момент.

    • Пример из жизни: wp_footer — хук для вывода кода перед закрывающим тегом </body>. Вы «вешаете» на него свой код для добавления Яндекс.Метрики.

  • Filter (Фильтр) — это конвейерная лента, по которой едет деталь (данные). Вы можете её взять, изменить и отдать обратно. Например, лента «название автомобиля» (фильтр the_title) или лента «цена» (фильтр woocommerce_product_price).

    • Пример из жизни: the_content — через этот фильтр проходит весь контент поста перед выводом. Вы можете «перехватить» его и добавить в конец каждой статьи блок с подпиской.

Проще: Action = СДЕЛАТЬ что-то в момент X. Filter = ИЗМЕНИТЬ данные Y перед их использованием.

Часть 2: Как это выглядит в коде? Базовая анатомия

Ваш код всегда состоит из двух частей: функции-обработчика и её привязки к хуку.

  1. Добавляем Action (делаем что-то):

    php
    // 1. Создаём функцию, которая ЧТО-ТО ДЕЛАЕТ function my_custom_action_function() { echo '<p>Этот текст выведется в хук wp_footer</p>'; } // 2. Вешаем эту функцию на нужный Action-хук add_action( 'wp_footer', 'my_custom_action_function' );
  2. Добавляем Filter (меняем данные):

    php
    // 1. Создаём функцию, которая ЧТО-ТО МЕНЯЕТ (обязательно возвращает значение!) function my_custom_filter_function( $content ) { $new_content = $content . '<p>Подпишитесь на нашу рассылку!</p>'; return $new_content; // ВАЖНО: вернуть изменённые данные! } // 2. Вешаем эту функцию на нужный Filter-хук add_filter( 'the_content', 'my_custom_filter_function' );

Часть 3: Где искать хуки? Карта сокровищ

  1. Кодекс WordPress: Официальный справочник по Actions и Filters. Устарел, но для базовых вещей полезен.

  2. Гугление: «hook woocommerce checkout field» или «action after post save».

  3. Поиск по исходному коду: Откройте файлы темы или плагина и ищите do_action( или apply_filters(. Всё, что в скобках — название хука.

    php
    // В коде темы/плагина вы видите: do_action( 'my_theme_before_header' ); // Значит, вы можете использовать: add_action( 'my_theme_before_header', 'your_function' );
  4. Плагин «Simply Show Hooks»: Активируйте его, и он наглядно покажет все хуки на текущей странице прямо в интерфейсе.

Часть 4: 5 Практических примеров «из жизни»

Пример 1: Добавить пользовательское поле в админку редактирования поста (Action)

php
add_action( 'add_meta_boxes', 'add_my_custom_box' ); function add_my_custom_box() { add_meta_box( 'my_box_id', 'Дополнительные настройки', 'my_box_html', 'post' ); } function my_box_html( $post ) { echo '<input type="text" name="my_field" value="'.get_post_meta($post->ID, 'my_field', true).'">'; }

Пример 2: Изменить количество товаров на странице архива WooCommerce (Filter)

php
add_filter( 'loop_shop_per_page', 'new_loop_shop_per_page', 20 ); function new_loop_shop_per_page( $cols ) { return 12; // Вместо стандартных 12 будет 20 товаров }

Пример 3: Добавить класс к тегу body (Filter)

php
add_filter( 'body_class', 'add_my_page_class' ); function add_my_page_class( $classes ) { if ( is_page( 'about' ) ) { $classes[] = 'about-page'; } return $classes; }

Пример 4: Отложить загрузку комментариев для скорости (Action)

php
// Убираем стандартные скрипты комментариев из head add_action( 'wp_enqueue_scripts', 'dequeue_comments_reply' ); function dequeue_comments_reply() { if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { wp_enqueue_script( 'comment-reply' ); } else { wp_dequeue_script( 'comment-reply' ); } }

Пример 5: Изменить текст «Читать далее» (Filter)

php
add_filter( 'excerpt_more', 'new_excerpt_more' ); function new_excerpt_more( $more ) { return '... <a href="' . get_permalink() . '">[Читать полностью]</a>'; }

Часть 5: Продвинутые приёмы: Приоритеты и аргументы

Хуки могут иметь приоритет и принимать несколько аргументов.

  • Приоритет (priority): Определяет порядок выполнения функций на одном хуке. По умолчанию 10. Чем меньше число, тем раньше выполнится.

    php
    add_action( 'wp_head', 'function_one', 5 ); // Выполнится ПЕРВОЙ add_action( 'wp_head', 'function_two', 20 ); // Выполнится ПОСЛЕ function_one
  • Количество аргументов (accepted_args): Сколько параметров передать вашей функции.

    php
    // Хук передаёт 2 параметра: $post_id и $post add_action( 'save_post', 'my_save_function', 10, 2 ); function my_save_function( $post_id, $post ) { // Теперь мы можем работать с обоими параметрами }

Часть 6: Куда вставлять этот код? Правильно и безопасно

  1. Файл functions.php вашей ДОЧЕРНЕЙ темы. Это лучшее место для хуков, связанных с темой.

  2. Плагин для кастомного кода (например, Code Snippets). Идеально! Не зависит от темы, легко управлять, не пропадёт при обновлении.

  3. Собственный mu-plugin. Для критически важного кода, который должен работать всегда.

Никогда не правьте functions.php родительской темы и файлы ядра WordPress!


Заключение

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

Начните с малого: Скопируйте пример с изменением текста «Читать далее» (excerpt_more), вставьте его в плагин Code Snippets и активируйте. Вы только что совершили свою первую безопасную кастомизацию через фильтр!