Что делает хук woocommerce_checkout_update_order_review
Хук woocommerce_checkout_update_order_review срабатывает при обновлении данных оформления заказа (checkout) через AJAX, например, при изменении способа доставки или оплаты. Он позволяет добавить кастомный PHP-код, который изменит или добавит данные в сессию оформления заказа, а также модифицировать вывод на странице checkout без перезагрузки.
Диагностика задачи: когда нужен этот хук
Если нужно динамически менять данные на странице оформления заказа в зависимости от выбора пользователя (например, показывать дополнительные поля, изменять сумму доставки, применять кастомные скидки), стандартных настроек WooCommerce недостаточно. Тогда woocommerce_checkout_update_order_review — идеальный инструмент.
Пример проблемы
- Необходимо добавить дополнительный сбор при выборе определённого способа доставки;
- Показывать кастомные сообщения или поля в checkout после изменения способа оплаты;
- Динамически менять стоимость доставки без перезагрузки страницы.
Пошаговое решение с примерами кода
1. Добавление пользовательского сбора при выборе способа доставки
Добавим 200 рублей к стоимости доставки, если выбран определённый метод доставки flat_rate:10:
add_action('woocommerce_checkout_update_order_review', 'custom_fee_on_shipping_method_change', 10, 1);
function custom_fee_on_shipping_method_change($posted_data) {
parse_str($posted_data, $output);
if (isset($output['shipping_method'][0]) && $output['shipping_method'][0] === 'flat_rate:10') {
WC()->cart->add_fee('Дополнительный сбор', 200);
}
}2. Обновление итоговой суммы и перерисовка блока checkout
Чтобы изменения вступили в силу, нужно убедиться, что корзина пересчитывается и вывод обновляется. WooCommerce автоматически делает это при AJAX.
3. Кастомизация ответа AJAX для вывода дополнительных данных
Если нужно добавить кастомный HTML или JSON-данные к ответу AJAX, используйте фильтр woocommerce_update_order_review_fragments:
add_filter('woocommerce_update_order_review_fragments', 'custom_checkout_fragments');
function custom_checkout_fragments($fragments) {
ob_start();
echo '<div id="custom-info">Вы выбрали особый способ доставки</div>';
$fragments['#custom-info'] = ob_get_clean();
return $fragments;
}Проверка результата после внедрения
- Откройте страницу оформления заказа;
- Выберите метод доставки
flat_rate:10; - Убедитесь, что сумма итогового заказа увеличилась на 200 рублей;
- Проверьте появление кастомного блока с сообщением под формой;
- Обновите другие способы доставки и проверьте, что сбор добавляется/удаляется корректно.
Частые ошибки и как их исправить
- Сбор не добавляется или не обновляется
— Проверьте, что вы правильно парсите$posted_dataчерезparse_str. Иногда данные передаются в другом формате.
— Убедитесь, что метод доставки указан верно, например,flat_rate:10именно так в вашей настройке. - Изменения не отображаются без перезагрузки страницы
— WooCommerce использует AJAX для обновления, поэтому убедитесь, что скрипты не конфликтуют с вашим кодом.
— Используйте фильтрwoocommerce_update_order_review_fragmentsдля обновления кастомных блоков. - Ошибка «Cannot add fees after calculation»
— Добавляйте сборы только при вызове хукаwoocommerce_cart_calculate_feesили черезwoocommerce_checkout_update_order_review, не в других местах.
Практические советы по безопасности и производительности
- Не используйте глобальные переменные без проверки — всегда валидируйте
$posted_data. - Не добавляйте тяжелые вычисления в хук, чтобы не замедлять AJAX-запросы оформления заказа.
- Кешируйте результаты, если нужно обращаться к внешним API.
- Всегда тестируйте совместимость с другими плагинами, особенно с кеширующими и оптимизирующими.
Таблица сравнения способов добавления пользовательских сборов в WooCommerce
| Метод | Пример | Плюсы | Минусы |
|---|---|---|---|
Хук woocommerce_cart_calculate_fees | | Простой, стандартный способ | Не срабатывает при динамическом обновлении checkout без перезагрузки |
Хук woocommerce_checkout_update_order_review | | Поддерживает AJAX обновление, динамические изменения | Сложнее в реализации, требует парсинга данных |