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

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

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

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

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

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

Для начала определите slug атрибута, по которому хотите фильтровать товары. Например, атрибут pa_color со значением red.

2. Добавление фильтра в functions.php

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

add_filter('woocommerce_add_to_cart_validation', 'exclude_products_by_attribute', 10, 3);
function exclude_products_by_attribute($passed, $product_id, $quantity) {
    // Атрибут для фильтрации
    $attribute_name = 'pa_color'; // slug атрибута
    $excluded_value = 'red'; // значение для исключения

    $product = wc_get_product($product_id);
    if (!$product) {
        return $passed;
    }

    // Получаем массив значений атрибута
    $attributes = $product->get_attributes();
    if (isset($attributes[$attribute_name])) {
        $attr = $attributes[$attribute_name];
        // Проверяем, является ли атрибут таксономией
        if ($attr->is_taxonomy()) {
            $terms = wp_get_post_terms($product_id, $attribute_name, array('fields' => 'slugs'));
            if (in_array($excluded_value, $terms)) {
                wc_add_notice(__('Этот товар нельзя добавить в корзину из-за выбранного атрибута.', 'woocommerce'), 'error');
                return false;
            }
        } else {
            // Атрибут пользовательский
            $values = explode('|', $attr->get_options());
            if (in_array($excluded_value, $values)) {
                wc_add_notice(__('Этот товар нельзя добавить в корзину из-за выбранного атрибута.', 'woocommerce'), 'error');
                return false;
            }
        }
    }

    return $passed;
}

3. Кеширование и производительность

Если на сайте много товаров и атрибутов, рассмотрите кеширование результатов или предварительную фильтрацию, чтобы не нагружать сервер при каждом добавлении товара в корзину.

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

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

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

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

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

  • Не изменяйте ядро WooCommerce — используйте хуки и фильтры.
  • Размещайте кастомный код в дочерней теме или отдельном плагине, чтобы не потерять изменения при обновлениях.
  • Для сайтов с высокой нагрузкой применяйте объектное кеширование и минимизируйте количество запросов к базе при проверке атрибутов.
  • Отслеживайте логи ошибок PHP, чтобы вовремя заметить проблемы с проверкой атрибутов.

Сравнение подходов: плагин vs кастомный код

МетодПлюсыМинусы
Готовый плагин (например, WooCommerce Conditional Shipping and Payments)Быстрая установка, поддержка, интерфейс настройкиПлатный, может быть избыточным для простой задачи, нагрузка на систему
Кастомный код в functions.phpПолный контроль, бесплатный, легкийТребует навыков, нужно тестировать самостоятельно
Как отключить AJAX в WooCommerce для улучшения производительности
07.05.2026
Как автоматизировать удаление старых постов в WordPress через плагины и код
14.03.2026
Как удалить или изменить slug таксономии в WordPress
15.02.2026
Как удалить или изменить заголовок страницы в WordPress
30.11.2025
Как создать собственный шорткод в WordPress
05.11.2025