Хуки в 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: Как это выглядит в коде? Базовая анатомия
Ваш код всегда состоит из двух частей: функции-обработчика и её привязки к хуку.
- Добавляем Action (делаем что-то):
// 1. Создаём функцию, которая ЧТО-ТО ДЕЛАЕТ function my_custom_action_function() { echo '<p>Этот текст выведется в хук wp_footer</p>'; } // 2. Вешаем эту функцию на нужный Action-хук add_action( 'wp_footer', 'my_custom_action_function' );
- Добавляем Filter (меняем данные):
// 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: Где искать хуки? Карта сокровищ
- Кодекс WordPress: Официальный справочник по Actions и Filters. Устарел, но для базовых вещей полезен.
- Гугление: «hook woocommerce checkout field» или «action after post save».
- Поиск по исходному коду: Откройте файлы темы или плагина и ищите
do_action(илиapply_filters(. Всё, что в скобках — название хука.// В коде темы/плагина вы видите: do_action( 'my_theme_before_header' ); // Значит, вы можете использовать: add_action( 'my_theme_before_header', 'your_function' );
- Плагин «Simply Show Hooks»: Активируйте его, и он наглядно покажет все хуки на текущей странице прямо в интерфейсе.
Часть 4: 5 Практических примеров «из жизни»
Пример 1: Добавить пользовательское поле в админку редактирования поста (Action)
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)
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)
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)
// Убираем стандартные скрипты комментариев из 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)
add_filter( 'excerpt_more', 'new_excerpt_more' ); function new_excerpt_more( $more ) { return '... <a href="' . get_permalink() . '">[Читать полностью]</a>'; }
Часть 5: Продвинутые приёмы: Приоритеты и аргументы
Хуки могут иметь приоритет и принимать несколько аргументов.
- Приоритет (priority): Определяет порядок выполнения функций на одном хуке. По умолчанию 10. Чем меньше число, тем раньше выполнится.
add_action( 'wp_head', 'function_one', 5 ); // Выполнится ПЕРВОЙ add_action( 'wp_head', 'function_two', 20 ); // Выполнится ПОСЛЕ function_one
- Количество аргументов (accepted_args): Сколько параметров передать вашей функции.
// Хук передаёт 2 параметра: $post_id и $post add_action( 'save_post', 'my_save_function', 10, 2 ); function my_save_function( $post_id, $post ) { // Теперь мы можем работать с обоими параметрами }
Часть 6: Куда вставлять этот код? Правильно и безопасно
- Файл
functions.phpвашей ДОЧЕРНЕЙ темы. Это лучшее место для хуков, связанных с темой. - Плагин для кастомного кода (например, Code Snippets). Идеально! Не зависит от темы, легко управлять, не пропадёт при обновлении.
- Собственный mu-plugin. Для критически важного кода, который должен работать всегда.
Никогда не правьте functions.php родительской темы и файлы ядра WordPress!
Заключение
Хуки — это суперсилия каждого разработчика и продвинутого владельца сайта на WordPress. Они превращают WordPress из монолитной системы в гибкий конструктор, где вы можете переопределить практически любую логику.
Начните с малого: Скопируйте пример с изменением текста «Читать далее» (excerpt_more), вставьте его в плагин Code Snippets и активируйте. Вы только что совершили свою первую безопасную кастомизацию через фильтр!