Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Блочные и классические корзина и оформление

Страницы «Корзина» и «Оформление заказа» бывают двух видов. Классические выводятся шорткодами и 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_fieldswoocommerce_register_additional_checkout_field()
woocommerce_after_checkout_validationПроверка в описании поля
woocommerce_checkout_order_processedwoocommerce_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, а на странице ничего не меняется. Ошибок в журнале нет, поэтому ищут опечатку. Сначала проверьте, блочная страница или классическая, — в девяти случаях из десяти причина в этом.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.