Как исключить товары и варианты WooCommerce по атрибуту из корзины и оформления заказа

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

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

Без такой фильтрации пользователь может оформить заказ с запрещёнными товарами, что приведёт к проблемам в обработке и неудовлетворённости клиента.

Как проверить, что товар имеет нужный атрибут

Атрибуты в WooCommerce хранятся как термины таксономии. Чтобы проверить, есть ли у товара атрибут, используйте следующий код:

function has_product_attribute( $product_id, $attribute_slug, $term_slug ) {
    $taxonomy = 'pa_' . $attribute_slug; // Префикс pa_ для атрибутов
    $terms = wp_get_post_terms( $product_id, $taxonomy );
    if ( is_wp_error( $terms ) || empty( $terms ) ) {
        return false;
    }
    foreach ( $terms as $term ) {
        if ( $term->slug === $term_slug ) {
            return true;
        }
    }
    return false;
}

Пример: проверить, есть ли у товара атрибут ne-dostavlyaetsya с термином da (т.е. «нельзя доставить» = «да»).

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

Ниже приведён полный код, который:

  • Блокирует добавление в корзину товаров с определённым атрибутом
  • Удаляет такие товары из уже существующей корзины при переходе к оформлению
  • Выводит уведомление пользователю о причине удаления
add_filter( 'woocommerce_add_to_cart_validation', 'exclude_products_by_attribute', 10, 3 );
function exclude_products_by_attribute( $passed, $product_id, $quantity ) {
    if ( has_product_attribute( $product_id, 'ne-dostavlyaetsya', 'da' ) ) {
        wc_add_notice( 'Этот товар нельзя добавить в корзину из-за ограничений доставки.', 'error' );
        return false;
    }
    return $passed;
}

add_action( 'woocommerce_check_cart_items', 'remove_excluded_products_from_cart' );
function remove_excluded_products_from_cart() {
    $cart = WC()->cart;
    $removed = false;
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product_id = $cart_item['product_id'];
        if ( has_product_attribute( $product_id, 'ne-dostavlyaetsya', 'da' ) ) {
            $cart->remove_cart_item( $cart_item_key );
            $removed = true;
        }
    }
    if ( $removed ) {
        wc_add_notice( 'Некоторые товары были удалены из корзины, так как они недоступны для оформления заказа.', 'error' );
    }
}

Как работает решение

  • Фильтр woocommerce_add_to_cart_validation предотвращает добавление товара с запрещённым атрибутом в корзину.
  • Хук woocommerce_check_cart_items срабатывает при загрузке страницы корзины и оформления, удаляет запрещённые товары из корзины, если они там оказались.
  • Пользователь получает понятные сообщения об ошибках.

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

  • Попробуйте добавить в корзину товар с атрибутом ne-dostavlyaetsya=da — добавление должно быть заблокировано с сообщением об ошибке.
  • Если такой товар уже есть в корзине (например, до внедрения кода), перейдите на страницу корзины — товар автоматически удалится, появится уведомление.
  • Обычные товары без этого атрибута добавляются и оформляются без проблем.

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

  • Ошибка: Неправильный префикс таксономии атрибута.
    Решение: Убедитесь, что используете pa_ + слаг атрибута, например, pa_ne-dostavlyaetsya.
  • Ошибка: Атрибут не привязан к товару или термин отсутствует.
    Решение: Проверьте, что атрибут и термин созданы в админке WooCommerce и назначены товару.
  • Ошибка: Товары с вариациями не блокируются.
    Решение: При работе с вариациями проверяйте атрибуты вариации, а не только родительского товара. Можно добавить проверку $cart_item['variation_id'].
  • Ошибка: Сообщения об ошибке не отображаются.
    Решение: Проверьте, что в теме корректно выводятся уведомления WooCommerce через wc_print_notices().

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

  • Кэширование: избегайте кеширования страниц корзины и оформления, чтобы фильтры работали корректно.
  • Оптимизация кода: если много товаров и атрибутов, можно кешировать результаты has_product_attribute() в рамках одного запроса.
  • Безопасность: всегда проверяйте входные данные и используйте штатные хуки WooCommerce, чтобы не ломать логику оформления.

Таблица сравнений способов исключения товаров по атрибуту

МетодПреимуществаНедостаткиПример кода
Фильтр добавления в корзинуПростое решение, блокирует добавление сразуНе удаляет уже добавленные товарыwoocommerce_add_to_cart_validation
Удаление при проверке корзиныУдаляет уже добавленные запрещённые товарыТовар может появиться в корзине на короткое времяwoocommerce_check_cart_items
JavaScript-блокировкаУлучшает UX (скрывает кнопки)Легко обходится, небезопасноJS код на фронтэнде
Комбинация фильтров + удаленияМаксимальная надёжность и UXНемного сложнее в реализацииПример из статьи
Оптимизация изображений в WordPress: улучшение скорости и SEO
02.12.2025
Как удалить зависшие transienty в WordPress для ускорения сайта
25.03.2026
Как удалить зависшие meta поля в WordPress
13.03.2026
Как использовать WPReg_cron для автоматизации задач в WordPress
10.02.2026
Как удалить зависшие варианты товаров WooCommerce по атрибуту
30.04.2026