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

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

В WooCommerce часто возникает задача запретить покупателям добавлять в корзину товары с определёнными атрибутами или автоматически удалять их из корзины при определённых условиях. Например, вы хотите запретить одновременную покупку товаров с атрибутом "Размер: XL" вместе с другими товарами, либо не допустить покупку товаров с атрибутом "Состояние: Б/У".

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

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

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

Для реализации логики удаления товаров по заданным атрибутам из корзины используйте хук woocommerce_before_calculate_totals. Ниже приведён пример кода, который удаляет из корзины все товары с атрибутом pa_color равным red (цвет красный):

add_action('woocommerce_before_calculate_totals', 'exclude_products_by_attribute_from_cart', 10, 1);
function exclude_products_by_attribute_from_cart( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) {
        return;
    }

    // Атрибут для проверки. Префикс pa_ — системный для атрибутов
    $target_attribute = 'pa_color';
    $target_value = 'red';

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];

        // Получаем атрибуты товара
        $attributes = $product->get_attributes();

        if ( isset( $attributes[ $target_attribute ] ) ) {
            $attribute_obj = $attributes[ $target_attribute ];

            // Проверяем, что атрибут является вариативным
            if ( $attribute_obj->is_taxonomy() ) {
                $terms = wp_get_post_terms( $product->get_id(), $target_attribute, array('fields' => 'slugs') );

                if ( in_array( $target_value, $terms ) ) {
                    // Удаляем товар из корзины
                    $cart->remove_cart_item( $cart_item_key );
                }
            } else {
                // Атрибуты без таксономии
                $options = $attribute_obj->get_options();
                if ( in_array( $target_value, $options ) ) {
                    $cart->remove_cart_item( $cart_item_key );
                }
            }
        }
    }
}

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

Объяснение кода

  • Хук срабатывает перед пересчётом корзины.
  • Проходим по всем товарам, проверяем наличие нужного атрибута и его значение.
  • Если условие выполнено — удаляем товар из корзины.

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

1. В админке WooCommerce создайте или отредактируйте товар с нужным атрибутом (например, цвет красный).

2. Добавьте этот товар в корзину вместе с другими товарами.

3. Перейдите в корзину — товар с указанным атрибутом должен автоматически исчезнуть.

4. При попытке добавить товар с запрещённым атрибутом через AJAX или форму добавления в корзину он будет удалён при пересчёте.

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

  • Атрибут не удаляется из корзины: возможно, указан неправильный слаг атрибута. Проверьте точное имя в Products > Attributes в админке (например, pa_color).
  • Удаляются не те товары: проверьте, что значение атрибута совпадает с используемым слагом (например, red а не Red или "Красный").
  • Код вызывает ошибки PHP: убедитесь, что используете правильный синтаксис, особенно при работе с объектами и массивами.
  • Удаление не происходит в админке или AJAX: код игнорирует админку, чтобы не мешать работе бэкенда, это нормальное поведение.

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

  • Не выполняйте удаление товаров слишком часто — используйте хук woocommerce_before_calculate_totals с условием, чтобы минимизировать нагрузку.
  • Кэширование товаров и атрибутов не реализуйте вручную, WooCommerce уже оптимизирует эти процессы.
  • Если логика усложняется, рассмотрите создание собственного плагина вместо добавления кода в functions.php.

Альтернативные варианты: плагин или код

МетодПлюсыМинусыПример
Код в functions.phpБесплатно, гибко, прямое управлениеТребует знаний PHP, может сломаться при обновленияхПример выше
Плагин по контролю корзиныУдобный интерфейс, поддержкаМожет быть платным, лишний кодWooCommerce Conditional Shipping and Payments
Как избежать повторяющихся вариаций товара в WooCommerce
04.05.2026
Как создать уникальные URL для товаров в WooCommerce
08.02.2026
Как сделать мультиязычность в WordPress без плагинов: практическое руководство
26.01.2026
Как создать и использовать динамические таблицы в WordPress
17.11.2025
Автоматический бэкап WordPress: лучшие плагины и примеры кода
25.11.2025