Что такое хук woocommerce_checkout_update_order_review и зачем он нужен
Хук woocommerce_checkout_update_order_review вызывается при обновлении блока оформления заказа (checkout) на стороне клиента, когда пользователь изменяет данные, например, адрес доставки, способ оплаты или способ доставки. Это позволяет выполнять дополнительные действия или вносить изменения в заказ до его финализации, что полезно для динамической кастомизации процесса оформления.
Диагностика: когда и как применять этот хук
Если вы хотите динамически менять доступные способы доставки, цены, или добавлять дополнительные проверки на этапе оформления заказа без перезагрузки страницы — этот хук идеален. Пример сценария: отключить определённый способ доставки при изменении адреса или добавить дополнительную плату при определённых условиях.
Как проверить, вызывается ли хук
add_action('woocommerce_checkout_update_order_review', function($posted_data) {
error_log('Hook woocommerce_checkout_update_order_review triggered');
error_log('Posted data: ' . $posted_data);
});
После добавления этого кода в functions.php или плагин, обновите страницу оформления заказа, измените что-то — в файле debug.log появится запись, что хук сработал.
Пошаговое решение: изменяем доступные способы доставки в зависимости от выбранного города
Цель: при выборе города «Москва» отключить доставку «Самовывоз».
add_action('woocommerce_checkout_update_order_review', 'custom_filter_shipping_methods_based_on_city', 10, 1);
function custom_filter_shipping_methods_based_on_city($posted_data) {
parse_str($posted_data, $output);
if (empty($output['billing_city'])) {
return;
}
$city = sanitize_text_field($output['billing_city']);
if (strtolower($city) === 'москва') {
add_filter('woocommerce_package_rates', 'disable_pickup_shipping_method', 10, 2);
} else {
remove_filter('woocommerce_package_rates', 'disable_pickup_shipping_method', 10);
}
}
function disable_pickup_shipping_method($rates, $package) {
foreach ($rates as $rate_id => $rate) {
if (strpos($rate_id, 'local_pickup') !== false) {
unset($rates[$rate_id]);
}
}
return $rates;
}
Объяснение:
- С помощью
parse_strраспарсиваем POST-данные из AJAX запроса. - Проверяем город из поля
billing_city. - Если город Москва, добавляем фильтр, который удалит метод доставки «Самовывоз».
- Если другой город — фильтр снимается.
Проверка результата после внедрения
Перейдите на страницу оформления заказа, измените город на «Москва». Метод доставки «Самовывоз» должен исчезнуть из списка. При смене города на любой другой — метод снова появляется.
Для дополнительной отладки можно добавить error_log в функции, чтобы видеть, какие данные приходят и когда фильтр применяется.
Частые ошибки и как их исправлять
- Ошибка: Методы доставки не меняются после выбора города.
Причина: Хук подключён, но фильтр не добавляется/не удаляется корректно.
Решение: Убедитесь, чтоadd_filterиremove_filterвызываются в правильном месте, и что при смене города AJAX-запрос действительно отправляется. - Ошибка: Метод доставки исчезает навсегда.
Причина: Фильтр не удаляется при смене города на другой.
Решение: Проверьте логику вызоваremove_filter, вызовите его правильно, чтобы фильтр удалялся. - Ошибка: Некорректная обработка
$posted_data.
Решение: Убедитесь, что используетеparse_strдля разбора строки, а не пытаетесь использовать её как массив напрямую.
Практические советы по безопасности и производительности
- Обязательно используйте функции очистки данных:
sanitize_text_field, чтобы предотвратить XSS и другие атаки. - Не добавляйте фильтры внутри функций без условий — это может привести к многократному добавлению и ухудшению производительности.
- Для больших магазинов с множеством способов доставки тестируйте логику на предмет влияния на скорость отклика AJAX.
- Логируйте ошибки в
debug.logпо необходимости, но отключайте логи на продакшене.
Сравнение вариантов изменения методов доставки
| Метод | Плагин | Код на хук woocommerce_checkout_update_order_review | Компромиссы |
|---|---|---|---|
| Полная кастомизация доставки | Плагины с настройками доставки | Гибкий кастомный код | Плагины проще, но менее гибки; код требует поддержки |
| Динамическое отключение методов | Редко встречается в плагинах | Легко реализовать через хук | Требует базовых знаний PHP и WooCommerce |
| Производительность | Плагины могут создавать нагрузку | Код работает быстрее при оптимальном написании | Риск багов при ошибках в коде |