Что такое хук checkout_process в WooCommerce и зачем он нужен
Хук checkout_process вызывается в процессе обработки формы оформления заказа. Именно на этом этапе WooCommerce выполняет валидацию данных, введённых пользователем, и только после успешной проверки создаёт заказ. Используя этот хук, можно добавить собственную логику проверки, которая не предусмотрена стандартными средствами, например, проверку кастомных полей, условий оплаты или ограничений по товарам.
Диагностика необходимости дополнительной проверки
Если стандартные проверки WooCommerce не покрывают ваши бизнес-требования, например:
- Нужно запретить оформление заказа при определённых условиях (например, если в корзине есть товар из категории «Выпускные товары» и покупатель не указал дату события).
- Требуется дополнительная валидация кастомных полей, добавленных в форму оформления заказа.
- Необходимо ограничить способы оплаты в зависимости от суммы заказа или геолокации.
Тогда работа с checkout_process — правильный инструмент.
Пошаговое решение: как добавить проверку на checkout_process
Рассмотрим пример, где при оформлении заказа мы проверяем, что пользователь заполнил кастомное поле event_date — дату события, которая обязательна, если в корзине есть товар из категории «event-products».
add_action('woocommerce_checkout_process', 'custom_validate_event_date_field');
function custom_validate_event_date_field() {
// Проверяем, есть ли товар из категории 'event-products'
$has_event_product = false;
foreach (WC()->cart->get_cart() as $cart_item) {
$product_id = $cart_item['product_id'];
if (has_term('event-products', 'product_cat', $product_id)) {
$has_event_product = true;
break;
}
}
// Если товар из категории есть, проверяем поле 'event_date'
if ($has_event_product) {
if (empty($_POST['event_date'])) {
wc_add_notice(__('Пожалуйста, укажите дату события для товаров из категории "Выпускные товары".'), 'error');
} else {
// Дополнительно можно проверить формат даты
$date = DateTime::createFromFormat('Y-m-d', sanitize_text_field($_POST['event_date']));
if (!$date || $date->format('Y-m-d') !== sanitize_text_field($_POST['event_date'])) {
wc_add_notice(__('Дата события указана в неверном формате. Используйте ГГГГ-ММ-ДД.'), 'error');
}
}
}
}Для корректной работы добавьте поле event_date в форму оформления заказа, например, так:
add_action('woocommerce_after_order_notes', 'custom_add_event_date_field');
function custom_add_event_date_field($checkout) {
echo '<div id="custom_event_date_field"><h3>Дата события</h3>';
woocommerce_form_field('event_date', array(
'type' => 'date',
'class' => array('event-date form-row-wide'),
'label' => __('Дата события'),
'placeholder' => __('Выберите дату события'),
), $checkout->get_value('event_date'));
echo '</div>';
}Как проверить, что решение сработало
- Добавьте в корзину товар из категории
event-products. - Перейдите к оформлению заказа без заполнения поля «Дата события» — должна появиться ошибка.
- Впишите дату в формате ГГГГ-ММ-ДД — ошибка должна исчезнуть, и оформление заказа пройдет.
- Попробуйте добавить товар из другой категории — поле становится необязательным и ошибки нет.
Частые ошибки и как их исправить
- Ошибка: Проверка не срабатывает, хотя условие выполнено.
Причина: Неверный слаг категории товара, например, вместоevent-productsуказали другое имя.
Решение: Проверьте слаг категории в админке WordPress > Товары > Категории. - Ошибка: Поле не добавляется в форму оформления заказа.
Причина: Хук добавления поля используется неправильно.
Решение: Убедитесь, что функция сwoocommerce_after_order_notesподключена и в теме нет конфликтов с выводом полей. - Ошибка: Ошибка валидации не отображается.
Причина: Не вызвана функцияwc_add_notice()с типом'error'.
Решение: Используйте именноwc_add_notice('Сообщение', 'error')для вывода ошибок.
Практические советы по безопасности и производительности при использовании хука checkout_process
- Всегда используйте
sanitize_text_field()или соответствующие функции для очистки данных из$_POSTперед обработкой. - Избегайте сложных и тяжёлых запросов в проверках — кешируйте результаты, если требуется обращение к базе.
- Не выводите избыточные сообщения об ошибках, чтобы не запутать пользователя.
- Регулярно тестируйте совместимость с WooCommerce и обновлениями темы.
Сравнение способов добавления дополнительной проверки на этапе оформления заказа
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Хук woocommerce_checkout_process | Прямая валидация на сервере, поддерживается WooCommerce, легко добавить кастомную логику | Не подходит для валидации на клиенте, требует знаний PHP | Обязательная валидация данных, влияющих на заказ |
| JavaScript-валидация на клиенте | Быстрая обратная связь пользователю, уменьшение нагрузки на сервер | Можно обойти, не надежно для критичных проверок | Улучшение UX, вторичная проверка |
| Плагины валидации форм | Простота использования, готовые шаблоны | Могут конфликтовать, ограниченная гибкость | Безопасная валидация без кастомного кода |