Блочные и классические корзина и оформление
Страницы «Корзина» и «Оформление заказа» бывают двух видов. Классические выводятся шорткодами и PHP-шаблонами. Блочные — блоками редактора, которые рисует JavaScript в браузере. В новых магазинах по умолчанию стоят блочные, и от вида страницы зависит, какие хуки на ней сработают.
Как узнать вариант
Откройте «Страницы → Корзина» в редакторе:
| Что на странице | Вариант |
|---|---|
| Блок «Корзина» с вложенными блоками | Блочный |
Шорткод [woocommerce_cart] | Классический |
| Блок «Оформление заказа» | Блочный |
Шорткод [woocommerce_checkout] | Классический |
В коде то же проверяет функция WordPress has_block():
// wp-content/plugins/acme-shop/includes/checkout.php
function acme_is_block_checkout(): bool
{
return has_block('woocommerce/checkout', wc_get_page_id('checkout'));
}Функция возвращает true, если на странице оформления стоит блок. Файл includes/checkout.php создайте и подключите в acme-shop.php — он пригодится в следующей главе.
Что работает в обоих вариантах
Расчёты выполняются на сервере одинаково, поэтому хуки расчёта общие:
| Хук | Что делает |
|---|---|
woocommerce_before_calculate_totals | Меняет цены в корзине |
woocommerce_cart_calculate_fees | Добавляет сборы и скидки |
woocommerce_package_rates | Меняет стоимость доставки |
woocommerce_add_to_cart_validation | Проверяет добавление в корзину |
woocommerce_add_cart_item_data | Сохраняет данные позиции |
woocommerce_order_status_... | Реагирует на состояние заказа |
woocommerce_thankyou | Страница «Заказ принят» |
Что работает только в классическом
Всё, что выводит HTML или относится к PHP-форме оформления:
| Хук | Замена в блочном варианте |
|---|---|
woocommerce_before_cart, woocommerce_after_cart_table | Обычные блоки в редакторе страницы |
woocommerce_checkout_fields | woocommerce_register_additional_checkout_field() |
woocommerce_after_checkout_validation | Проверка в описании поля |
woocommerce_checkout_order_processed | woocommerce_store_api_checkout_order_processed |
Копии шаблонов cart/ и checkout/ | Не используются |
В блочном варианте эти хуки не вызываются и ошибок не дают — код просто молчит.
Вернуть классический вариант
Если доработки магазина рассчитаны на классические хуки, страницу переключают. Откройте «Страницы → Оформление заказа», удалите блок «Оформление заказа» и вставьте блок «Шорткод» с текстом:
[woocommerce_checkout]То же для корзины с шорткодом [woocommerce_cart]. После сохранения страница рисуется PHP-шаблонами, и все хуки из старых примеров начинают работать.
Совместимость плагина
Плагин может сообщить, что проверен с блочными страницами, — рядом с объявлением HPOS в главном файле:
// wp-content/plugins/acme-shop/acme-shop.php
add_action('before_woocommerce_init', function () {
if (class_exists(\Automattic\WooCommerce\Utilities\FeaturesUtil::class)) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility(
'cart_checkout_blocks',
__FILE__,
true
);
}
});Третий аргумент false означает обратное: плагин с блоками несовместим, и редактор страницы предупредит об этом владельца магазина.
Что выбрать
| Ситуация | Вариант |
|---|---|
| Новый магазин, мало доработок | Блочный |
| Много своих полей и проверок на PHP | Классический |
| Плагины оплаты или доставки без поддержки блоков | Классический |
В этом курсе примеры оформления заказа написаны для классического варианта, а для блочного дана замена.
Частая ошибка
Код из статьи десятилетней давности подключают к woocommerce_before_cart или woocommerce_checkout_fields, а на странице ничего не меняется. Ошибок в журнале нет, поэтому ищут опечатку. Сначала проверьте, блочная страница или классическая, — в девяти случаях из десяти причина в этом.