wpcontrol.ru wordpress WPControl.ru

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

Что такое хук woocommerce_checkout_update_order_review и когда он срабатывает

Хук woocommerce_checkout_update_order_review вызывается при обновлении секции оформления заказа (checkout) через AJAX, например, когда меняются данные доставки, способ оплаты или купоны. Это позволяет реагировать на изменения данных на фронтенде и динамически обновлять дополнительные поля, расчёты или логику оформления.

Диагностика: почему хук не работает или данные не обновляются

  • Проверьте, что вызов AJAX срабатывает — откройте консоль браузера (F12) на странице оформления и посмотрите Network, есть ли запросы к /?wc-ajax=update_order_review.
  • Убедитесь, что ваш PHP код подключён и не содержит синтаксических ошибок.
  • Проверьте приоритет хуков: если ваш код срабатывает слишком рано или поздно, может не обновлять нужные данные.
  • Проверьте, что вы используете правильный параметр для передачи данных в AJAX.

Пошаговое решение: добавление кастомного поля и обработка через хук

Допустим, нужно добавить кастомное поле «Номер кабинета» на страницу оформления и обновлять стоимость доставки в зависимости от этого поля.

1. Добавляем поле на страницу оформления заказа

add_action('woocommerce_after_order_notes', 'add_custom_checkout_field');
function add_custom_checkout_field($checkout) {
    echo '<div id="custom_checkout_field">';
    woocommerce_form_field('room_number', array(
        'type' => 'text',
        'class' => array('room-number form-row-wide'),
        'label' => __('Номер кабинета'),
        'placeholder' => __('Введите номер кабинета'),
        'required' => false,
    ), $checkout->get_value('room_number'));
    echo '</div>';
}

2. Обработка изменения поля на фронтенде с обновлением блока заказа

В JS нужно триггерить событие обновления заказа при изменении поля:

jQuery(document).ready(function($) {
    $('#room_number').on('change', function() {
        $('body').trigger('update_checkout');
    });
});

3. Обработка на сервере с помощью хука woocommerce_checkout_update_order_review

add_action('woocommerce_checkout_update_order_review', 'custom_checkout_update_order_review');
function custom_checkout_update_order_review($posted_data) {
    parse_str($posted_data, $output);
    if (!empty($output['room_number'])) {
        // Сохраняем значение в сессию для дальнейших расчетов
        WC()->session->set('room_number', sanitize_text_field($output['room_number']));
    } else {
        WC()->session->set('room_number', '');
    }
}

4. Использование данных из сессии для изменения стоимости доставки

add_filter('woocommerce_package_rates', 'custom_adjust_shipping_cost', 10, 2);
function custom_adjust_shipping_cost($rates, $package) {
    $room_number = WC()->session->get('room_number');
    if ($room_number) {
        foreach ($rates as $rate_key => $rate) {
            // Пример: добавляем фиксированную доплату 100 руб, если номер кабинета заполнен
            $rates[$rate_key]->cost += 100;
        }
    }
    return $rates;
}

Проверка результата после внедрения

  • Обновите страницу оформления заказа и убедитесь, что поле «Номер кабинета» появляется.
  • Введите любое значение в это поле и измените его, проверьте, что AJAX запрос update_order_review отправляется (вкладка Network в DevTools).
  • Убедитесь, что стоимость доставки увеличивается на 100 рублей после ввода значения.
  • Сделайте заказ и посмотрите в админке, что кастомное поле сохранено (если добавите сохранение в метаданные заказа).

Частые ошибки и как их исправить

  • Не вызывается AJAX при изменении поля: забыли привязать событие change и вызвать update_checkout.
  • Данные не передаются в PHP: не используете parse_str для разбора $posted_data в хук woocommerce_checkout_update_order_review.
  • Не сохраняется значение в сессии: используете неверный ключ или не вызываете WC()->session->set().
  • Стоимость не меняется: забыли применить фильтр woocommerce_package_rates или неправильно рассчитываете стоимость.
  • Ошибка синтаксиса в PHP: проверьте правильность кавычек и отступов.

Практические советы по безопасности и производительности

  • Обязательно фильтруйте данные с фронтенда: используйте sanitize_text_field() или другие функции очистки.
  • Не храните чувствительные данные в сессии без необходимости.
  • Минимизируйте нагрузку на фильтр woocommerce_package_rates, не делайте сложных запросов внутри него — кешируйте результаты.
  • Для кеширования и оптимизации AJAX запросов можно использовать плагин Clearfy Pro с https://wpshop.ru/?utm_source=wpcontrol.ru&utm_medium=article&utm_campaign=kak-pravilno-ispolzovat-huk-woocommerce-checkout-update-order-review

Сравнение вариантов реализации динамического обновления заказа

ВариантПлюсыМинусыКогда использовать
Использовать woocommerce_checkout_update_order_review с AJAXДинамическое обновление без перезагрузки страницы, гибкостьНужно писать JS и PHP код, возможны сложности с дебагомКогда нужно реагировать на изменения в checkout и менять стоимость или поля
Простое добавление полей без AJAXПросто и быстроОбновление данных только после отправки формы, не интерактивноДля простых данных, не влияющих на стоимость и логику
Использование сторонних плагинов для кастомизации checkoutБыстро, готовые решенияМогут быть тяжёлыми и конфликтоватьЕсли нет времени на код, нужна универсальность
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙