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

Что такое хук 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
ПроизводительностьПлагины могут создавать нагрузкуКод работает быстрее при оптимальном написанииРиск багов при ошибках в коде
Как сделать многоязычный сайт на WordPress без плагинов
16.04.2026
Как запретить регистрацию в WordPress без плагинов
25.01.2026
Как удалить старые transient данные в WordPress без плагинов
11.03.2026
Как добавить уникальные поля в форму регистрации WordPress с проверкой уникальности
24.02.2026
Как добавить собственные поля в WordPress без плагинов
02.11.2025