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

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

В WooCommerce бывают ситуации, когда необходимо запретить добавление или покупку товаров с определёнными атрибутами. Например, товар с атрибутом «Размер: XXL» не может быть заказан в интернет-магазине из-за ограниченного запаса или политики магазина. Без правильного ограничения такие товары могут попасть в корзину, что приводит к ошибкам при оформлении заказа и негативному опыту пользователя.

Проверить, есть ли товары с нежелательными атрибутами в корзине, можно с помощью отладочного вывода:

foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    $product = $cart_item['data'];
    $attributes = $product->get_attributes();
    error_log('Product ID: ' . $product->get_id());
    error_log(print_r($attributes, true));
}

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

1. Определяем атрибуты для исключения

Выберите слаг атрибута и значение, по которым нужно ограничить товары. Например, атрибут с слагом pa_size и значение xxl.

2. Добавляем проверку в корзину и блокируем товары

Используем хук woocommerce_check_cart_items для проверки при обновлении корзины и при оформлении заказа. Если найдены товары с запрещённым атрибутом, выводим ошибку и удаляем их из корзины.

add_action( 'woocommerce_check_cart_items', 'exclude_products_by_attribute_from_cart' );
function exclude_products_by_attribute_from_cart() {
    $excluded_attribute_slug = 'pa_size';
    $excluded_value = 'xxl';

    $cart = WC()->cart->get_cart();
    $removed_items = [];

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

        if ( isset( $attributes[ $excluded_attribute_slug ] ) ) {
            $attribute = $attributes[ $excluded_attribute_slug ];
            // Проверяем, что атрибут является вариативным
            if ( $attribute->is_taxonomy() ) {
                $terms = wp_get_post_terms( $product->get_id(), $excluded_attribute_slug, array( 'fields' => 'slugs' ) );
                if ( in_array( $excluded_value, $terms ) ) {
                    WC()->cart->remove_cart_item( $cart_item_key );
                    $removed_items[] = $product->get_name();
                }
            } else {
                if ( strtolower( $attribute->get_options()[0] ) === $excluded_value ) {
                    WC()->cart->remove_cart_item( $cart_item_key );
                    $removed_items[] = $product->get_name();
                }
            }
        }
    }

    if ( ! empty( $removed_items ) ) {
        wc_add_notice( sprintf( 'Следующие товары удалены из корзины, потому что их размер %s недоступен для заказа: %s', $excluded_value, implode( ', ', $removed_items ) ), 'error' );
    }
}

3. Проверяем работу скрипта

Добавьте в корзину товар с нужным атрибутом (например, размер XXL). При попытке перейти к оформлению заказа появится сообщение об ошибке и товар автоматически удалится из корзины.

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

  • Добавьте в корзину товар с запрещённым атрибутом — он должен удалиться с ошибкой.
  • Товары без запрещённого атрибута добавляются и покупаются без проблем.
  • Проверьте на разных браузерах и при разных сценариях (обновление корзины, оформление заказа).

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

  • Ошибка: товары не удаляются, хотя должны
    Проверьте правильность слага атрибута (например, pa_size), он должен точно совпадать с названием таксономии атрибута.
  • Ошибка: не удаляются вариации товаров
    Убедитесь, что атрибут для вариации — таксономия, и используйте wp_get_post_terms() для проверки значений.
  • Ошибка: сообщение об ошибке не отображается
    Убедитесь, что вызван wc_add_notice() с правильным типом и что темы/плагины не отключают вывод уведомлений WooCommerce.

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

  • Добавляйте проверку атрибутов только в нужных хуках, чтобы не замедлять загрузку страниц без корзины.
  • Не храните большие списки запрещённых атрибутов в коде — используйте настройки или опции для удобного управления.
  • При большом количестве товаров с атрибутами кэшируйте результаты проверки, чтобы снизить нагрузку на базу.

Сравнение способов реализации ограничения товаров по атрибутам

МетодОписаниеПлюсыМинусы
PHP-код в functions.php Добавление фильтра с проверкой атрибутов при добавлении в корзину Легко кастомизировать, не требует плагинов Требует навыков программирования, при ошибках возможен сбой работы корзины
Плагин с настройками Специализированный плагин для ограничения товаров по атрибутам Удобный интерфейс для настройки, не нужно править код Может замедлить сайт, требует обновления, зависит от стороннего разработчика
Редактирование шаблонов WooCommerce Изменение логики отображения и добавления товаров через шаблоны Гибкий контроль на фронтенде Сложно поддерживать, не всегда блокирует добавление на уровне сервера
Как создать AJAX фильтр товаров в WordPress
16.01.2026
Автоматизация создания и удаления тем в WordPress через код
22.01.2026
Как сделать автоматический импорт постов с изображениями в WordPress
28.03.2026
Добавление поля телефона в форму регистрации WordPress с подтверждением по SMS
09.01.2026
Динамические шорткоды с параметрами в WordPress: создание и применение
15.03.2026