Как диагностировать необходимость исключения товаров из корзины по атрибутам
В 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 |