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

В чём суть задачи и когда это нужно

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

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

Основная задача — определить, есть ли в корзине товары с нужными атрибутами. Атрибуты в WooCommerce — это свойства товаров, которые можно задать в админке. Для проверки нужно пройтись по всем товарам в корзине и проверить наличие целевых атрибутов.

Для диагностики используйте следующий код в functions.php или в собственном плагине для отладки:

function debug_check_cart_for_attribute( $attribute_name, $attribute_value ) {
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $attributes = $product->get_attributes();
        if ( isset( $attributes[ $attribute_name ] ) ) {
            $terms = wc_get_product_terms( $product->get_id(), $attribute_name, array( 'fields' => 'names' ) );
            if ( in_array( $attribute_value, $terms, true ) ) {
                error_log( "Товар с атрибутом $attribute_name: $attribute_value найден в корзине" );
                return true;
            }
        }
    }
    error_log( "Товар с атрибутом $attribute_name: $attribute_value НЕ найден в корзине" );
    return false;
}

После добавления товаров с нужным атрибутом в корзину и перехода на страницу оформления заказа, смотрите журнал ошибок PHP (error_log), чтобы убедиться, что функция находит нужные товары.

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

1. Определяем атрибут (например, pa_status) и значение (например, preorder).

2. Создаём функцию проверки корзины на наличие таких товаров.

3. Используем хук woocommerce_checkout_process для блокировки оформления.

4. Добавляем уведомление пользователю о причине блокировки.

add_action( 'woocommerce_checkout_process', 'block_checkout_if_cart_has_attribute' );
function block_checkout_if_cart_has_attribute() {
    $attribute_name = 'pa_status'; // техническое имя атрибута
    $attribute_value = 'preorder'; // значение, при котором блокируем

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $terms = wc_get_product_terms( $product->get_id(), $attribute_name, array( 'fields' => 'slugs' ) );
        if ( in_array( $attribute_value, $terms, true ) ) {
            wc_add_notice( 'Оплата недоступна: в вашей корзине есть товары с пометкой «Предзаказ». Пожалуйста, свяжитесь с нами для уточнения.', 'error' );
            break;
        }
    }
}

Дополнительно: блокируем кнопку «Оформить заказ» на фронте

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

add_filter( 'woocommerce_order_button_html', 'disable_place_order_button_if_attribute' );
function disable_place_order_button_if_attribute( $button_html ) {
    $attribute_name = 'pa_status';
    $attribute_value = 'preorder';

    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $terms = wc_get_product_terms( $product->get_id(), $attribute_name, array( 'fields' => 'slugs' ) );
        if ( in_array( $attribute_value, $terms, true ) ) {
            return '<button type="submit" class="button alt" disabled style="opacity: 0.5; cursor: not-allowed;">Оплата недоступна</button>';
        }
    }
    return $button_html;
}

Как проверить, что всё работает

  1. Создайте атрибут товара в WooCommerce, например pa_status, и добавьте значение preorder.
  2. Назначьте этот атрибут одному или нескольким товарам в магазине.
  3. Добавьте такие товары в корзину.
  4. Перейдите к оформлению заказа — должно появиться сообщение об ошибке, и оформление будет заблокировано.
  5. На странице корзины кнопка «Оформить заказ» будет отключена (серой и недоступной для клика).
  6. Если удалить товары с этим атрибутом из корзины, оформление снова станет доступным.

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

  • Неправильное имя атрибута: В WooCommerce атрибуты товаров имеют префикс pa_. Проверьте точное техническое имя атрибута в разделе «Атрибуты» — оно должно совпадать с используемым в коде.
  • Значение атрибута указано не slug, а название: В функции wc_get_product_terms важно указывать, что берутся слаги (slug), если сравниваете с ними.
  • Кэширование страницы корзины или оформления заказа: Иногда кэш мешает обновлению состояния кнопки или сообщения. Очистите кэш или используйте режим разработчика для проверки.
  • Проблемы с темой или плагинами: Если другие плагины или тема переопределяют обработку кнопки оформления заказа, нужно проверить совместимость и приоритеты хуков.

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

  • Не используйте тяжелые операции в цикле проверки корзины. В приведённом примере мы только получаем атрибуты и сравниваем — это быстро и не создаёт нагрузки.
  • Используйте правильные хуки WooCommerce (woocommerce_checkout_process для проверки на этапе оформления и woocommerce_order_button_html для управления кнопкой).
  • Обязательно проверяйте, что в корзине есть товары, чтобы не вызывать лишних ошибок.
  • Для улучшения UX показывайте поясняющие сообщения пользователю, чтобы он понимал причину блокировки.

Сравнение способов реализации блокировки оплаты

СпособПлюсыМинусы
PHP-код на хуках WooCommerceЛёгкость настройки, контроль, без сторонних плагиновТребует навыков программирования, возможна несовместимость с кастомными темами
Плагин блокировки товаровПростота использования, визуальные настройкиДополнительная нагрузка, возможны конфликты с другими плагинами
JavaScript-скрипты для скрытия кнопкиБыстрое визуальное решениеНе блокирует серверную обработку, легко обходится пользователем
Как создать автоматический импорт товаров в WordPress с помощью WPRemark
01.02.2026
Как создать автоматический системный логгер в WordPress для отладки и мониторинга
12.03.2026
Как создать индивидуальные типы постов в WordPress с поддержкой метаполей
05.03.2026
Как использовать WPRemark для оценки комментариев в WordPress
29.12.2025
Как создать интерактивные формы в WordPress без плагинов
01.12.2025