wpnotes.ru wordpress WP Notes

Использование хука woocommerce_before_checkout_form для дополнительных проверок на этапе оформления заказа

Для чего нужен хук 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.
  • Если такие есть, выводит ошибку на странице оформления заказа.
  • Блокирует отображение блока оплаты, тем самым не давая завершить заказ.

Проверка результата после внедрения

  1. Добавьте в корзину товар из категории zapreshchennye-tovary.
  2. Перейдите к оформлению заказа.
  3. Должно появиться сообщение об ошибке "Оформление заказа с товарами из категории 'Запрещённые товары' недоступно.".
  4. Блок оплаты не должен отображаться, кнопка «Оформить заказ» будет недоступна.
  5. Если убрать товар из этой категории, сообщение исчезнет и форма оформления заказа станет доступна.

Частые ошибки и как их исправить

  • Ошибка: Сообщение не появляется.
    Причина: Неправильный слаг категории или товар не относится к нужной категории.
    Решение: Проверьте слаг категории через админку 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;
        }
    }
}
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее