Использование хука woocommerce_checkout_update_order_review для кастомизации оформления заказа в WooCommerce

Что делает хук 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
add_action('woocommerce_cart_calculate_fees', function() {
    WC()->cart->add_fee('Сбор', 100);
});
Простой, стандартный способНе срабатывает при динамическом обновлении checkout без перезагрузки
Хук woocommerce_checkout_update_order_review
add_action('woocommerce_checkout_update_order_review', 'custom_fee', 10, 1);
function custom_fee($posted_data) {
    // ваш код
}
Поддерживает AJAX обновление, динамические измененияСложнее в реализации, требует парсинга данных
Как запретить отображение версии WordPress для безопасности сайта
05.03.2026
Запрет на индексацию сайта WordPress через robots.txt и .htaccess: практические методы
28.01.2026
Как запретить регистрацию в WordPress без плагинов
25.01.2026
Как добавить уникальные поля в форму регистрации WordPress с проверкой уникальности
24.02.2026
Как удалить старые ревизии постов в WordPress с помощью PHP кода
22.03.2026