WooCommerce: как заблокировать оплату при наличии товаров с определёнными атрибутами в корзине

Диагностика проблемы: почему и когда блокировать оплату

В интернет-магазинах на WooCommerce иногда требуется запретить оформление заказа, если в корзине находятся товары с определёнными атрибутами. Это может понадобиться, например, для товаров с ограничениями по доставке, несовместимых товаров или при акциях, когда нельзя совмещать скидки.

Часто пользователи сталкиваются с тем, что стандартных настроек WooCommerce не хватает, а плагины слишком громоздкие или не дают нужной гибкости.

Пошаговое решение: блокируем оплату при наличии товаров с заданными атрибутами

1. Определяем атрибуты товаров для проверки

Для примера возьмём атрибут color со значением red. Задача — запретить оплату, если в корзине есть хотя бы один товар с цветом «red».

2. Добавляем проверку в функцию

Используем хук woocommerce_checkout_process, чтобы проверять корзину при оформлении заказа и блокировать оплату с сообщением об ошибке.

add_action('woocommerce_checkout_process', 'block_checkout_if_red_color_in_cart');
function block_checkout_if_red_color_in_cart() {
    // Атрибут и значение для проверки
    $attribute_name = 'pa_color'; // системное имя атрибута
    $attribute_value = 'red';

    foreach (WC()->cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        // Получаем значения атрибута
        $attributes = $product->get_attributes();

        if (isset($attributes[$attribute_name])) {
            $terms = wp_get_post_terms($product->get_id(), $attribute_name, array('fields' => 'slugs'));
            if (in_array($attribute_value, $terms)) {
                wc_add_notice(__('Оплата невозможна: в корзине есть товар с запрещённым атрибутом «Красный».'), 'error');
                break;
            }
        }
    }
}

3. Добавляем блокировку кнопки «Оформить заказ» через JavaScript

Чтобы улучшить UX, можно сразу блокировать кнопку оформления, если в корзине есть запрещённые товары, без ожидания отправки формы.

add_action('wp_footer', 'disable_checkout_button_if_red_color');
function disable_checkout_button_if_red_color() {
    if (!is_checkout()) return;
    ?>
    <script>
    jQuery(document).ready(function($) {
        function checkCart() {
            var blocked = false;
            <?php
            foreach (WC()->cart->get_cart() as $cart_item) {
                $product = $cart_item['data'];
                $terms = wp_get_post_terms($product->get_id(), 'pa_color', array('fields' => 'slugs'));
                if (in_array('red', $terms)) {
                    echo 'blocked = true;';
                    break;
                }
            }
            ?>
            if (blocked) {
                $('button[name="woocommerce_checkout_place_order"]').prop('disabled', true).after('<p style="color:red;">Оплата заблокирована из-за наличия товара с атрибутом «Красный».</p>');
            }
        }
        checkCart();
    });
    </script>
    <?php
}

Как проверить, что решение сработало

  • Добавьте в магазин товар с атрибутом color = red.
  • Положите его в корзину и перейдите к оформлению заказа.
  • При попытке оформить заказ должна появиться ошибка и блокировка кнопки.
  • Если удалить этот товар из корзины, оформление заказа станет доступно.

Частые ошибки и способы их исправления

  • Неверное имя атрибута: WooCommerce использует системные имена с префиксом pa_. Проверьте точное имя через админку или базу данных.
  • Атрибут не используется у товара: Функция проверяет только товары с заданным атрибутом. Если у товара нет атрибута, проверка пропускается.
  • Кэширование страницы оформления заказа: Кэш может мешать обновлению состояния кнопки. Отключите кэширование на страницах корзины и оформления заказа.
  • JavaScript конфликтует с другими скриптами: Проверьте консоль браузера на ошибки, используйте уникальные селекторы для кнопки.

Практические советы по безопасности и производительности

  • Не храните логику блокировки только на клиенте (JS). Всегда проверяйте на сервере через woocommerce_checkout_process, чтобы избежать обхода.
  • Минимизируйте количество вызовов wp_get_post_terms — при большом количестве товаров в корзине это может замедлить оформление заказа.
  • Для сложных правил используйте кэширование результатов проверки в сессии пользователя.
  • Если атрибутов много — рассмотрите создание отдельного мета-поля или таксономии с быстрым доступом.

Таблица сравнения способов блокировки оплаты по атрибутам

МетодПлюсыМинусыКогда использовать
Серверная проверка на PHP (woocommerce_checkout_process)Надёжно, нельзя обойтиМожет влиять на время отклика при большом объёме товаровОбязательна для безопасности
Блокировка кнопки через JSУлучшает UX, моментальная реакцияМожно обойти, выключив JSДополнение к серверной проверке
Плагины для блокировки корзиныГотовые решения, настройки в UIМогут быть тяжёлыми и не гибкимиЕсли нет навыков программирования
Как настроить автоматическое удаление старых записей в WordPress
15.02.2026
Оптимизация базы данных WordPress без повышения нагрузки на сервер
11.12.2025
Как удалить неиспользуемые мета данные в WordPress для оптимизации базы
18.03.2026
WooCommerce: как заблокировать оплату при наличии товаров с определёнными атрибутами в корзине
25.06.2026
WooCommerce: как исключить товары с определёнными атрибутами из корзины
10.05.2026