Что такое хук 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 | Быстро, готовые решения | Могут быть тяжёлыми и конфликтовать | Если нет времени на код, нужна универсальность |