Хуки: действия и фильтры
Хук — именованная точка в коде WooCommerce, к которой подключают свои функции. Хуки бывают двух видов: действие что-то делает в нужный момент, фильтр изменяет значение и возвращает его. Почти любая доработка магазина начинается с вопроса «к какому хуку подключиться».
Действие
Действие подключают функцией add_action(). Допишите в includes/storefront.php:
// wp-content/plugins/acme-shop/includes/storefront.php
add_action('woocommerce_thankyou', function (int $orderId) {
echo '<p>Мы позвоним вам в течение часа.</p>';
});WooCommerce вызывает хук woocommerce_thankyou на странице «Заказ принят» и передаёт номер заказа. Оформите тестовый заказ — абзац появится под сведениями о заказе. Действие ничего не возвращает: оно выводит текст, отправляет письмо, пишет в базу.
Фильтр
Фильтр подключают функцией add_filter(). Он получает значение, меняет его и обязан вернуть:
// wp-content/plugins/acme-shop/includes/storefront.php
add_filter('woocommerce_product_single_add_to_cart_text', function (string $text): string {
return 'Купить';
});На странице товара кнопка «В корзину» теперь называется «Купить». Если забыть return, кнопка останется без текста.
Приоритет и аргументы
У add_action() и add_filter() есть ещё два параметра: приоритет и число аргументов.
// wp-content/plugins/acme-shop/includes/storefront.php
add_filter('woocommerce_get_price_html', function (string $html, WC_Product $product): string {
return $product->is_on_sale() ? $html . ' <small>акция</small>' : $html;
}, 20, 2);Приоритет 20 означает «выполнить позже стандартных функций»: по умолчанию он равен 10, меньшее число выполняется раньше. Число 2 говорит, что функция принимает два аргумента — без него WordPress передаст только первый. У товаров со скидкой рядом с ценой появится слово «акция».
Отключение чужой функции
Подключённую функцию можно снять — тем же именем и приоритетом:
// wp-content/plugins/acme-shop/includes/storefront.php
add_action('init', function () {
remove_action('woocommerce_before_shop_loop', 'woocommerce_result_count', 20);
});Со страницы каталога исчезнет строка «Отображение 1–12 из 40». Снимать функции нужно после того, как WooCommerce их подключил, поэтому вызов обёрнут в хук init.
Как найти хук
| Способ | Как |
|---|---|
| Шаблон | Откройте файл в woocommerce/templates/ и найдите do_action( |
| Поиск по коду | Ищите apply_filters( рядом с нужным значением |
| Документация | Справочник хуков на developer.woocommerce.com |
| Плагин Query Monitor | Показывает хуки, сработавшие на текущей странице |
Например, в templates/single-product/add-to-cart/simple.php перед кнопкой стоит do_action('woocommerce_before_add_to_cart_button') — значит, свой блок перед кнопкой подключают к этому хуку.
Частые хуки
| Хук | Вид | Где срабатывает |
|---|---|---|
woocommerce_before_shop_loop | действие | Над списком товаров |
woocommerce_single_product_summary | действие | Правая колонка страницы товара |
woocommerce_thankyou | действие | Страница «Заказ принят» |
woocommerce_get_price_html | фильтр | HTML цены товара |
loop_shop_per_page | фильтр | Число товаров на странице каталога |
Частая ошибка
В фильтре пишут echo вместо return. Текст выводится в случайном месте страницы — там, где фильтр был вызван, — а само значение становится пустым. Действие выводит, фильтр возвращает: по названию функции add_action или add_filter всегда понятно, что требуется.