Диагностика задачи: зачем исключать товары по атрибутам из корзины
В интернет-магазинах на WooCommerce иногда требуется ограничить возможность покупки определённых товаров или их комбинаций. Например, товары с определённым атрибутом (цвет, размер, тип) могут быть недоступны для одновременной покупки или вовсе не должны попадать в корзину. Такая задача возникает при ограничениях по поставке, акциях, или маркетинговых правилах.
Как проверить наличие товара с нужным атрибутом в корзине
Для начала нужно определить, как в WooCommerce хранится информация об атрибутах товара в корзине. Атрибуты хранятся в объекте WC_Product, к которому можно получить доступ из элементов корзины.
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data']; // WC_Product объект
// Получаем атрибуты
$attributes = $product->get_attributes();
// Можно проверить нужный атрибут
}Для вариативных товаров атрибуты хранятся в $cart_item['variation_attributes'].
Пошаговое решение: исключение товаров с определённым атрибутом из корзины
1. Определяем атрибут и значение для исключения
Например, исключим из корзины товары с атрибутом pa_color и значением red.
2. Используем хук woocommerce_check_cart_items для проверки и удаления
Хук запускается при проверке содержимого корзины перед оформлением заказа.
add_action( 'woocommerce_check_cart_items', function() {
$cart = WC()->cart;
$items_to_remove = [];
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$variation_attributes = isset($cart_item['variation_attributes']) ? $cart_item['variation_attributes'] : [];
// Проверяем, есть ли нужный атрибут и совпадает ли значение
if ( isset( $variation_attributes['attribute_pa_color'] ) && $variation_attributes['attribute_pa_color'] === 'red' ) {
$items_to_remove[] = $cart_item_key;
}
}
// Удаляем найденные товары из корзины
foreach( $items_to_remove as $key_to_remove ) {
$cart->remove_cart_item( $key_to_remove );
}
if ( ! empty( $items_to_remove ) ) {
wc_add_notice( 'Товары красного цвета запрещены к покупке и были удалены из корзины.', 'error' );
}
} );3. Где разместить код
Этот код можно добавить в файл functions.php текущей темы или в пользовательский плагин.
Проверка результата после внедрения
- Добавьте в корзину товар с атрибутом
pa_color=red— он должен автоматически удалиться с сообщением об ошибке. - Добавьте товар с другими значениями атрибута — он должен остаться в корзине.
- Проверьте, что оформление заказа проходит без ошибок, если в корзине нет запрещённых товаров.
Частые ошибки и как исправить
- Неправильное имя атрибута: WooCommerce добавляет префикс
attribute_pa_к slug атрибута. Например, атрибутЦветс ярлыкомcolor. Нужно использовать именноattribute_pa_color, а неcolor. - Проверка не для вариаций: если товар простой (simple product), атрибуты нужно проверять через
$product->get_attributes(), а не вvariation_attributes. - Код не срабатывает: убедитесь, что WooCommerce активен и что код подключен корректно (в functions.php или плагине).
Практические советы для расширения и безопасности
- Для многоязычных сайтов учитывайте, что значение атрибута может быть локализовано. Лучше сравнивать slug, а не названия.
- Если исключать нужно сложные комбинации атрибутов, используйте дополнительные проверки через
$product->get_attributes()и функции WooCommerce для парсинга. - Для контроля логики исключения можно добавить опцию в админку с помощью Settings API.
Сравнение подходов: плагин vs код
| Подход | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Быстро, без нагрузки, кастомизация под задачу | Требует навыков, сложнее поддерживать для новичков |
| Плагин (например, Conditional WooCommerce Plugins) | Готовое решение, настройки через UI | Может быть избыточным, нагрузка, не всегда гибко |