Хуки каталога и страницы товара
Страницы магазина собраны из хуков. Шаблон страницы товара почти пуст: в нём вызовы do_action(), а название, цену и кнопку выводят функции WooCommerce, подключённые к этим хукам с разными приоритетами. Поэтому страницу меняют, не трогая шаблон: добавляют свою функцию, снимают стандартную или меняют порядок.
Код этого урока пишется в includes/storefront.php.
Добавить блок
// wp-content/plugins/acme-shop/includes/storefront.php
add_action('woocommerce_single_product_summary', function () {
echo '<p class="acme-guarantee">Обмен и возврат в течение 30 дней.</p>';
}, 35);Хук woocommerce_single_product_summary выводит правую колонку страницы товара. Приоритет 35 ставит абзац сразу под кнопкой «В корзину» — откройте любой товар, чтобы увидеть его.
Карта страницы товара
| Хук | Приоритет | Стандартный блок |
|---|---|---|
woocommerce_before_single_product_summary | 10 | Значок «Распродажа» |
| 20 | Галерея картинок | |
woocommerce_single_product_summary | 5 | Название |
| 10 | Рейтинг и цена | |
| 20 | Краткое описание | |
| 30 | Кнопка «В корзину» | |
| 40 | Артикул, категории, метки | |
| 50 | Кнопки «Поделиться» | |
woocommerce_after_single_product_summary | 10 | Вкладки: описание, отзывы |
| 15 | Сопутствующие товары | |
| 20 | Похожие товары |
Свой блок встаёт между стандартными, если выбрать приоритет между их числами: 25 — между описанием и кнопкой, 45 — после артикула.
Убрать блок
// wp-content/plugins/acme-shop/includes/storefront.php
add_action('init', function () {
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_meta', 40);
remove_action('woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);
});Со страницы товара исчезнут строка с артикулом и категориями и блок «Похожие товары». В remove_action() указывают тот же хук, ту же функцию и тот же приоритет, с которыми блок подключён.
Переставить блок
Перестановка — это снять и подключить заново с другим приоритетом:
// wp-content/plugins/acme-shop/includes/storefront.php
add_action('init', function () {
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10);
add_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 29);
});Цена переедет из-под названия к кнопке «В корзину».
Карта плитки товара в каталоге
| Хук | Приоритет | Стандартный блок |
|---|---|---|
woocommerce_before_shop_loop_item | 10 | Открытие ссылки на товар |
woocommerce_before_shop_loop_item_title | 10 | Значок «Распродажа» и картинка |
woocommerce_shop_loop_item_title | 10 | Название |
woocommerce_after_shop_loop_item_title | 5 | Рейтинг |
| 10 | Цена | |
woocommerce_after_shop_loop_item | 5 | Закрытие ссылки |
| 10 | Кнопка «В корзину» |
// wp-content/plugins/acme-shop/includes/storefront.php
add_action('woocommerce_after_shop_loop_item_title', function () {
global $product;
if (!$product->is_in_stock()) {
echo '<span class="acme-out">Нет в наличии</span>';
}
}, 15);На странице /shop/ под ценой товаров, которых нет на складе, появится пометка.
Хуки вокруг списка
| Хук | Где |
|---|---|
woocommerce_before_main_content | Перед содержимым любой страницы магазина |
woocommerce_before_shop_loop | Над списком: число результатов и сортировка |
woocommerce_after_shop_loop | Под списком: постраничная навигация |
woocommerce_no_products_found | Когда товаров не найдено |
Частая ошибка
remove_action() вызывают на верхнем уровне файла или с неверным приоритетом — и блок остаётся на месте без каких-либо ошибок. Снимать можно только уже подключённую функцию и только с её приоритетом. Точные имя и число смотрите в файле woocommerce/includes/wc-template-hooks.php.