Для чего нужен хук woocommerce_before_checkout_form
Хук woocommerce_before_checkout_form срабатывает непосредственно перед выводом формы оформления заказа в WooCommerce. Это удобная точка для внедрения дополнительных проверок или уведомлений, которые должны быть выполнены до того, как пользователь начнёт вводить данные или отправлять заказ.
Например, с его помощью можно проверить наличие определённых товаров в корзине, проверить пользовательские метаданные, показать предупреждения или заблокировать оформление заказа при несоответствии условиям.
Диагностика задачи: когда и зачем использовать дополнительные проверки
Если вам нужно:
- запретить оформление заказа при наличии товаров из определённой категории;
- проверить, заполнены ли пользовательские поля профиля;
- показать кастомное уведомление без изменения шаблонов;
- выполнить интеграцию с внешней системой, проверив доступность сервиса перед заказом;
то хук woocommerce_before_checkout_form — наиболее удобное решение. Он позволяет внедрять логику без изменения core-файлов и плагинов.
Пошаговое решение: пример использования хука для проверки категории товаров в корзине
1. Добавляем код в functions.php вашей темы или дочерней темы
add_action('woocommerce_before_checkout_form', 'check_products_category_before_checkout');
function check_products_category_before_checkout() {
if ( is_admin() ) return; // исключаем админку
$category_to_check = 'zapreshchennye-tovary'; // слаг категории
$found = false;
foreach ( WC()->cart->get_cart() as $cart_item ) {
$product_id = $cart_item['product_id'];
if ( has_term( $category_to_check, 'product_cat', $product_id ) ) {
$found = true;
break;
}
}
if ( $found ) {
wc_print_notice( 'Оформление заказа с товарами из категории "Запрещённые товары" недоступно.', 'error' );
remove_action( 'woocommerce_checkout_order_review', 'woocommerce_checkout_payment', 20 ); // блокируем оплату
}
}2. Что делает этот код
- Проверяет товары в корзине на принадлежность к категории с слагом
zapreshchennye-tovary. - Если такие есть, выводит ошибку на странице оформления заказа.
- Блокирует отображение блока оплаты, тем самым не давая завершить заказ.
Проверка результата после внедрения
- Добавьте в корзину товар из категории
zapreshchennye-tovary. - Перейдите к оформлению заказа.
- Должно появиться сообщение об ошибке "Оформление заказа с товарами из категории 'Запрещённые товары' недоступно.".
- Блок оплаты не должен отображаться, кнопка «Оформить заказ» будет недоступна.
- Если убрать товар из этой категории, сообщение исчезнет и форма оформления заказа станет доступна.
Частые ошибки и как их исправить
- Ошибка: Сообщение не появляется.
Причина: Неправильный слаг категории или товар не относится к нужной категории.
Решение: Проверьте слаг категории через админку WooCommerce в разделе «Товары» – «Категории». Убедитесь, что товар действительно принадлежит этой категории. - Ошибка: Блок оплаты не блокируется.
Причина: Функцияremove_actionвызывается слишком рано или поздно.
Решение: Вызывайтеremove_actionвнутри того же хукаwoocommerce_before_checkout_formили используйте приоритеты, чтобы гарантировать удаление. - Ошибка: Сообщение появляется на всех страницах.
Причина: Не проверяется контекст страницы.
Решение: Добавьте проверкуis_checkout()перед выполнением кода, чтобы ограничить действие только страницей оформления заказа.
Практические советы для расширения и безопасности
- Используйте
is_user_logged_in()и проверяйте права пользователя, если ограничения должны работать только для определённых ролей. - Для более сложных проверок можно подключать внешние API, но помните об асинхронности и таймаутах, чтобы не замедлять загрузку страницы.
- Выводите уведомления через
wc_print_noticeс типом'error'или'notice'для корректного стилизованного отображения. - Для блокировки оформления заказа лучше использовать фильтр
woocommerce_checkout_processв связке с выводом уведомления, чтобы предотвратить обход через прямые запросы.
Альтернативные способы и сравнение подходов
| Метод | Где реализуется | Преимущества | Недостатки |
|---|---|---|---|
Хук woocommerce_before_checkout_form | Вывод формы оформления заказа | Легко вывести уведомление; не изменяет функционал оформления | Пользователь всё ещё может попытаться оформить заказ программно |
Фильтр woocommerce_checkout_process | Процесс отправки заказа | Полноценная блокировка с проверкой на сервере | Сообщения об ошибках нужно выводить отдельно |
| Переопределение шаблонов WooCommerce | Файлы темы | Полный контроль над внешним видом и логикой | Сложнее поддерживать при обновлениях WooCommerce |
Пример кода для фильтрации оформления заказа (дополнение)
add_action('woocommerce_checkout_process', 'block_checkout_if_forbidden_category');
function block_checkout_if_forbidden_category() {
$category_to_check = 'zapreshchennye-tovary';
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( has_term( $category_to_check, 'product_cat', $cart_item['product_id'] ) ) {
wc_add_notice( 'Вы не можете оформить заказ с товарами из категории "Запрещённые товары".', 'error' );
break;
}
}
}