Диагностика проблемы: зачем исключать товары из корзины по атрибутам
В интернет-магазинах на WooCommerce иногда возникает задача автоматически блокировать или удалять из корзины определённые товары по их атрибутам. Например, если товар с конкретным цветом или размером больше не доступен для продажи, или если в корзине одновременно не должны находиться товары из разных категорий или с конфликтующими атрибутами.
Стандартный функционал WooCommerce не позволяет гибко фильтровать корзину по атрибутам без доработок. Поэтому без кодового решения или плагина такие задачи остаются нерешёнными.
Пошаговое решение: фильтрация товаров в корзине по атрибутам
1. Определение условия исключения товаров
Для начала нужно чётко определить, по каким атрибутам товары нужно исключать. Например, исключать все товары с атрибутом color=red.
2. Добавление кода в файл functions.php или в плагин для сайта
Ниже пример кода, который при добавлении на сайт исключит из корзины все товары с атрибутом 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;
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
$attributes = $product->get_attributes();
if ( isset($attributes['pa_color']) ) {
$colors = $product->get_attribute('pa_color');
// Проверяем, есть ли красный цвет среди атрибутов
if ( strpos(strtolower($colors), 'red') !== false ) {
$cart->remove_cart_item( $cart_item_key );
wc_add_notice( __('Товар с цветом красный удалён из корзины.', 'woocommerce'), 'error' );
}
}
}
}3. Как использовать код для других атрибутов
Чтобы исключить товары по другому атрибуту, замените pa_color на нужный slug атрибута, а red — на нужное значение.
Проверка результата после внедрения
1. Добавьте в корзину товар с нужным атрибутом (например, цветом красный).
2. Обновите корзину или перейдите к ней.
3. Товар должен автоматически удалиться из корзины, а на экране появится сообщение об этом.
4. Товары без заданного атрибута остаются в корзине.
Частые ошибки и как их исправить
- Код не срабатывает: убедитесь, что атрибуты товаров действительно зарегистрированы как таксономии с префиксом
pa_и что вы правильно указали slug атрибута. - Товары не удаляются: может быть конфликт с другими плагинами, влияющими на корзину. Попробуйте отключить сторонние плагины и проверить снова.
- Сообщение об ошибке не выводится: убедитесь, что в теме выводятся уведомления WooCommerce через
wc_print_notices(). - Удаляется лишнее: проверьте точность условия
strpos(strtolower($colors), 'red'), при необходимости замените на более точные проверки (например, сравнение через explode атрибутов).
Практические советы по безопасности и производительности
- Используйте хук
woocommerce_before_calculate_totalsс небольшой приоритетом, чтобы исключить лишнюю нагрузку. - Не выполняйте тяжелые SQL-запросы внутри функции, лучше использовать встроенные методы WooCommerce для получения атрибутов.
- Всегда проверяйте, что действие происходит не в админке (кроме AJAX), чтобы не влиять на административную часть.
- Добавляйте пользовательские уведомления через
wc_add_notice, чтобы пользователь понимал причину удаления товара.
Альтернативы: плагин или код?
| Вариант | Плюсы | Минусы |
|---|---|---|
| Своя реализация на PHP (как в статье) | Гибкость, нет лишних зависимостей, можно кастомизировать под любые атрибуты | Требует навыков программирования, ошибки могут повлиять на работу корзины |
| Плагин фильтрации корзины по атрибутам | Быстрое решение, поддержка и обновления | Может быть избыточным, возможны конфликты, зависимость от стороннего кода |