Диагностика проблемы: почему нужно исключать товары по атрибутам из корзины
В WooCommerce бывают ситуации, когда необходимо запретить добавление или покупку товаров с определёнными атрибутами. Например, товар с атрибутом «Размер: XXL» не может быть заказан в интернет-магазине из-за ограниченного запаса или политики магазина. Без правильного ограничения такие товары могут попасть в корзину, что приводит к ошибкам при оформлении заказа и негативному опыту пользователя.
Проверить, есть ли товары с нежелательными атрибутами в корзине, можно с помощью отладочного вывода:
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
$attributes = $product->get_attributes();
error_log('Product ID: ' . $product->get_id());
error_log(print_r($attributes, true));
}Пошаговое решение: исключение товаров с определёнными атрибутами из корзины
1. Определяем атрибуты для исключения
Выберите слаг атрибута и значение, по которым нужно ограничить товары. Например, атрибут с слагом pa_size и значение xxl.
2. Добавляем проверку в корзину и блокируем товары
Используем хук woocommerce_check_cart_items для проверки при обновлении корзины и при оформлении заказа. Если найдены товары с запрещённым атрибутом, выводим ошибку и удаляем их из корзины.
add_action( 'woocommerce_check_cart_items', 'exclude_products_by_attribute_from_cart' );
function exclude_products_by_attribute_from_cart() {
$excluded_attribute_slug = 'pa_size';
$excluded_value = 'xxl';
$cart = WC()->cart->get_cart();
$removed_items = [];
foreach ( $cart as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
// Получаем значения атрибута для товара
$attributes = $product->get_attributes();
if ( isset( $attributes[ $excluded_attribute_slug ] ) ) {
$attribute = $attributes[ $excluded_attribute_slug ];
// Проверяем, что атрибут является вариативным
if ( $attribute->is_taxonomy() ) {
$terms = wp_get_post_terms( $product->get_id(), $excluded_attribute_slug, array( 'fields' => 'slugs' ) );
if ( in_array( $excluded_value, $terms ) ) {
WC()->cart->remove_cart_item( $cart_item_key );
$removed_items[] = $product->get_name();
}
} else {
if ( strtolower( $attribute->get_options()[0] ) === $excluded_value ) {
WC()->cart->remove_cart_item( $cart_item_key );
$removed_items[] = $product->get_name();
}
}
}
}
if ( ! empty( $removed_items ) ) {
wc_add_notice( sprintf( 'Следующие товары удалены из корзины, потому что их размер %s недоступен для заказа: %s', $excluded_value, implode( ', ', $removed_items ) ), 'error' );
}
}3. Проверяем работу скрипта
Добавьте в корзину товар с нужным атрибутом (например, размер XXL). При попытке перейти к оформлению заказа появится сообщение об ошибке и товар автоматически удалится из корзины.
Проверка результата после внедрения
- Добавьте в корзину товар с запрещённым атрибутом — он должен удалиться с ошибкой.
- Товары без запрещённого атрибута добавляются и покупаются без проблем.
- Проверьте на разных браузерах и при разных сценариях (обновление корзины, оформление заказа).
Частые ошибки и как их исправить
- Ошибка: товары не удаляются, хотя должны
Проверьте правильность слага атрибута (например,pa_size), он должен точно совпадать с названием таксономии атрибута. - Ошибка: не удаляются вариации товаров
Убедитесь, что атрибут для вариации — таксономия, и используйтеwp_get_post_terms()для проверки значений. - Ошибка: сообщение об ошибке не отображается
Убедитесь, что вызванwc_add_notice()с правильным типом и что темы/плагины не отключают вывод уведомлений WooCommerce.
Практические советы для безопасности и производительности
- Добавляйте проверку атрибутов только в нужных хуках, чтобы не замедлять загрузку страниц без корзины.
- Не храните большие списки запрещённых атрибутов в коде — используйте настройки или опции для удобного управления.
- При большом количестве товаров с атрибутами кэшируйте результаты проверки, чтобы снизить нагрузку на базу.
Сравнение способов реализации ограничения товаров по атрибутам
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| PHP-код в functions.php | Добавление фильтра с проверкой атрибутов при добавлении в корзину | Легко кастомизировать, не требует плагинов | Требует навыков программирования, при ошибках возможен сбой работы корзины |
| Плагин с настройками | Специализированный плагин для ограничения товаров по атрибутам | Удобный интерфейс для настройки, не нужно править код | Может замедлить сайт, требует обновления, зависит от стороннего разработчика |
| Редактирование шаблонов WooCommerce | Изменение логики отображения и добавления товаров через шаблоны | Гибкий контроль на фронтенде | Сложно поддерживать, не всегда блокирует добавление на уровне сервера |