Что такое hook woocommerce_checkout_update_order_review и зачем он нужен?
Хук woocommerce_checkout_update_order_review срабатывает при обновлении данных на странице оформления заказа (checkout) после изменения полей, таких как адрес, доставка, оплата. Его используют, чтобы выполнить дополнительную проверку или изменить данные заказа до окончательной отправки.
Этот хук позволяет внедрить кастомную логику валидации или обновления данных, недоступную через стандартные фильтры валидации WooCommerce.
Диагностика проблемы: почему стандартная валидация WooCommerce не всегда достаточна
Стандартные проверки WooCommerce охватывают базовые поля: email, адрес, телефон. Но в проектах часто требуется проверить более сложные условия, например:
- Проверка специальных промокодов, завязанных на поля профиля;
- Валидация по сторонним API (например, проверка адреса доставки через сервисы геокодирования);
- Проверка наличия определённых товаров или комбинаций в корзине;
- Динамическая проверка условий для скидок или бесплатной доставки.
Без использования woocommerce_checkout_update_order_review сложно получить актуальные данные заказа при изменении поля и вовремя заблокировать оформление.
Пошаговое решение: как использовать woocommerce_checkout_update_order_review для дополнительной валидации
1. Добавление кастомной проверки на сервере
В файле functions.php темы или в собственном плагине добавьте следующий код:
add_action('woocommerce_checkout_update_order_review', 'custom_checkout_additional_validation', 10, 1);
function custom_checkout_additional_validation($posted_data) {
parse_str($posted_data, $output);
// Пример: проверяем, что поле "custom_field" заполнено и содержит число больше 10
if (empty($output['custom_field']) || intval($output['custom_field']) <= 10) {
wc_add_notice('Пожалуйста, введите число больше 10 в дополнительное поле.', 'error');
}
}Объяснение:
$posted_data— строка с сериализованными данными формы checkout;- Функция
parse_strпревращает её в массив$output; - Проверяем наличие и значение поля
custom_field; - Если условие не выполнено, добавляем ошибку через
wc_add_noticeс типом 'error'.
2. Добавление поля custom_field в форму оформления заказа
Чтобы протестировать, добавим поле в checkout:
add_action('woocommerce_after_order_notes', 'custom_checkout_field');
function custom_checkout_field($checkout) {
echo '<p class="form-row form-row-wide">';
woocommerce_form_field('custom_field', array(
'type' => 'number',
'class' => array('custom-field-class form-row-wide'),
'label' => __('Введите число больше 10'),
'required' => true,
), $checkout->get_value('custom_field'));
echo '</p>';
}3. Обработка поля при сохранении заказа
Чтобы значение сохранялось в мета заказа:
add_action('woocommerce_checkout_update_order_meta', 'save_custom_checkout_field');
function save_custom_checkout_field($order_id) {
if (!empty($_POST['custom_field'])) {
update_post_meta($order_id, '_custom_field', sanitize_text_field($_POST['custom_field']));
}
}Проверка результата после внедрения
- Перейдите на страницу оформления заказа;
- В поле «Введите число больше 10» введите число меньше или оставьте пустым и попробуйте оформить заказ — должна появиться ошибка;
- Введите число 11 или больше — заказ должен пройти без ошибок;
- После оформления заказа проверьте в админке WooCommerce в деталях заказа наличие метаполя
_custom_fieldс вашим значением.
Частые ошибки и как их исправить
- Ошибка: функция не вызывается при изменении поля
Причина: не подключен хук или его приоритет ниже.
Решение: убедитесь, что код вfunctions.phpактивен, и хукadd_actionнаписан правильно. - Ошибка: уведомление об ошибке не отображается
Причина: неправильно добавленwc_add_noticeили отсутствуетwoocommerce_checkout_update_order_reviewна фронтенде.
Решение: убедитесь, что при ошибке вызываетсяwc_add_notice('...', 'error')и используйте стандартные шаблоны WooCommerce. - Ошибка: данные поля не сохраняются в заказе
Причина: отсутствует обработчикwoocommerce_checkout_update_order_meta.
Решение: добавьте код для сохранения метаполя, как показано выше.
Практические советы по безопасности и производительности
- Всегда используйте
sanitize_text_fieldили другие функции очистки данных перед сохранением в базу. - Проверяйте данные на стороне сервера, не полагайтесь на валидацию JavaScript.
- Для сложных проверок, например, запросов к внешним API, используйте кеширование результатов, чтобы не замедлять оформление заказа.
- Добавляйте минимальное количество логики в хук, чтобы не увеличивать время отклика страницы.
Сравнение способов добавления дополнительной валидации на checkout
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Хук woocommerce_checkout_process | Простой, стандартный для валидации | Не вызывается при AJAX-обновлении формы | add_action('woocommerce_checkout_process', 'custom_validation'); |
Хук woocommerce_checkout_update_order_review | Вызывается при каждом изменении полей, позволяет динамически валидировать | Нужно вручную парсить данные формы | add_action('woocommerce_checkout_update_order_review', 'custom_validation', 10, 1); |
| JavaScript-валидация на клиенте | Быстрая обратная связь | Безопасность слабая, легко обойти | jQuery validation или кастомный скрипт |