Что такое хук woocommerce_checkout_update_order_review и зачем он нужен
Этот AJAX-хук вызывается на этапе обновления блока с обзором заказа на странице оформления заказа WooCommerce. Его основной задачей является обновление данных заказа при изменении параметров, например, выбранного способа доставки, адреса или способа оплаты. Используя этот хук, можно внедрять кастомную логику в реальном времени, не перезагружая страницу.
Типичные сценарии применения
- Пересчет стоимости доставки в зависимости от выбранного адреса
- Добавление динамических скидок при изменении корзины на странице оформления
- Валидация пользовательских полей и обновление итоговой суммы
Диагностика проблем с обновлением обзора заказа
Если после изменения параметров на странице оформления заказа итоговая сумма или доставка не обновляются, возможно, AJAX-запрос, связанный с woocommerce_checkout_update_order_review, не срабатывает. Для диагностики:
- Откройте консоль браузера (F12) и проверьте наличие ошибок JS.
- Проверьте сетевые запросы в вкладке Network — должен быть запрос
admin-ajax.phpс действиемwoocommerce_checkout_update_order_review. - Если запрос не выполняется или возвращает ошибку, проверьте, не блокирует ли безопасность сервера AJAX-запросы.
Пошаговое решение: добавление кастомного расчёта при обновлении заказа
Рассмотрим пример, как добавить дополнительную плату за упаковку при сумме заказа более 1000 рублей.
1. Добавляем обработчик AJAX на сервере
add_action('woocommerce_checkout_update_order_review', 'custom_update_order_review_callback');
function custom_update_order_review_callback() {
if ( ! isset( $_POST['post_data'] ) ) {
return;
}
parse_str( $_POST['post_data'], $post_data );
// Получаем сумму корзины
$cart_total = WC()->cart->get_cart_contents_total();
// Добавляем дополнительную плату, если сумма больше 1000
if ( $cart_total > 1000 ) {
WC()->cart->add_fee( 'Упаковка', 50 );
} else {
// Удаляем плату, если она есть
WC()->cart->remove_fee( 'Упаковка' );
}
// Обновляем корзину
WC()->cart->calculate_totals();
}2. Проверяем обновление через AJAX
WooCommerce самостоятельно инициирует AJAX вызов этого хука при изменении данных формы оформления заказа. Наша задача — корректно обработать и обновить корзину.
3. Обработка на клиенте (необязательно)
Если требуется дополнительное действие, например, обновить кастомный блок, можно добавить JS:
jQuery(function($){
$(document.body).on('updated_checkout', function(){
console.log('Обзор заказа обновлен');
// Ваш кастомный код
});
});Проверка результата
- На странице оформления заказа добавьте товары на сумму более 1000 ₽.
- Обновите или измените адрес/способ доставки, чтобы триггерить AJAX обновление.
- Проверьте, что в итоговой сумме появилась дополнительная плата «Упаковка» на 50 ₽.
- Если сумма меньше 1000 ₽, плата не должна отображаться.
Частые ошибки и их исправление
- Плата не добавляется: убедитесь, что хук
woocommerce_checkout_update_order_reviewподключен корректно и функция вызывается. Проверьте, что корзина инициализированаWC()->cart. - Плата дублируется при каждом обновлении: используйте методы
add_feeиremove_feeаккуратно, проверяйте, что плата добавляется только один раз. - Ошибка AJAX: проверьте консоль браузера и ответ сервера. Возможна ошибка из-за ограничения безопасности или конфликтов плагинов.
Практические советы по производительности и безопасности
- Избегайте тяжелых вычислений в функции обработки AJAX — они влияют на скорость обновления заказа.
- Не забывайте проверять данные из
$_POSTна валидность и использовать функции фильтрации. - При необходимости добавляйте nonce-проверки для безопасности, хотя WooCommerce уже реализует базовую защиту.
- Тестируйте изменения на тестовом сайте, чтобы избежать сбоев на рабочем магазине.
Сравнение способов добавления дополнительной платы в WooCommerce
| Метод | Плюсы | Минусы | Использование |
|---|---|---|---|
Хук woocommerce_checkout_update_order_review | Обновление в реальном времени при изменении данных на странице оформления | Может влиять на производительность при сложных вычислениях | Динамическое управление платами на этапе оформления заказа |
Хук woocommerce_cart_calculate_fees | Добавление плат при расчете корзины, работает и в корзине, и при оформлении | Менее динамичен, не учитывает изменения без перезагрузки страницы | Добавление фиксированных плат или скидок |
| Плагины для корзины | Упрощают настройку без кода | Могут замедлять сайт, не всегда гибкие | Для пользователей без навыков программирования |