Диагностика проблемы с автоматическим сохранением корзины WooCommerce
WooCommerce по умолчанию сохраняет содержимое корзины для авторизованных пользователей, чтобы при повторных визитах корзина оставалась прежней. Однако для некоторых магазинов это вызывает проблемы: устаревшие или нежелательные товары остаются в корзине, что мешает корректной работе процессов оформления заказа или аналитики.
Кроме того, бывает необходимо автоматически удалять из корзины товары с определёнными атрибутами (например, по цвету, размеру или категории), чтобы исключить несовместимые или запрещённые комбинации.
Как проверить, что автоматическое сохранение корзины включено
По умолчанию WooCommerce сохраняет корзину через сессии и куки. Для проверки:
- Откройте консоль браузера, перейдите на страницу магазина.
- Добавьте товар в корзину.
- Обновите страницу или зайдите на другой — корзина должна остаться сохранённой.
Если корзина очищается после обновления — автоматическое сохранение отключено либо конфликтует с плагинами кэширования.
Пошаговое отключение автоматического сохранения корзины
WooCommerce не предоставляет прямого фильтра для отключения сохранения корзины, но можно очистить сессию пользователя при загрузке страницы, что эффективно "сбрасывает" корзину.
add_action('init', function() {
if ( is_user_logged_in() && !is_admin() ) {
WC()->session->destroy_session();
WC()->cart->empty_cart();
}
});
Этот код очищает сессию и корзину для авторизованных пользователей при каждом запросе. Для гостей можно аналогично реализовать очистку, но тогда корзина не будет сохраняться вообще.
Альтернативный вариант: отключение сохранения корзины только на определённых страницах
add_action('template_redirect', function() {
if ( is_cart() || is_checkout() ) {
WC()->session->destroy_session();
WC()->cart->empty_cart();
}
});
Это позволит сохранять корзину на страницах магазина, но очищать её перед оформлением заказа.
Автоматическое удаление товаров из корзины по атрибутам
Чтобы автоматически удалять товары, например, с атрибутом "цвет: красный", можно использовать следующий код в functions.php темы или в кастомном плагине:
add_action('woocommerce_before_cart', function() {
$cart = WC()->cart->get_cart();
foreach ($cart as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$attributes = $product->get_attributes();
// Пример: удалить товары с атрибутом pa_color = red
if (isset($attributes['pa_color'])) {
$terms = wc_get_product_terms($product->get_id(), 'pa_color', array('fields' => 'slugs'));
if (in_array('red', $terms, true)) {
WC()->cart->remove_cart_item($cart_item_key);
}
}
}
});
Здесь мы проверяем атрибуты каждого товара в корзине и удаляем по условию. Можно аналогично проверять другие атрибуты или кастомные метаданные.
Проверка результата после внедрения кода
- Очистите кеш браузера и, если используете, кеш плагинов.
- Добавьте в корзину товар с нужным атрибутом (например, цвет "red").
- Перейдите на страницу корзины — товар должен исчезнуть.
- Добавьте товар с другим атрибутом — он останется.
- Для отключения сохранения корзины — проверьте, что после обновления страницы корзина очищается.
Частые ошибки и как их исправлять
- WC()->cart возвращает null — убедитесь, что вызов происходит после инициализации WooCommerce, лучше использовать хук
woocommerce_before_cartили позднее. - Атрибуты не удаляются — проверьте, что атрибуты объявлены как таксономии (например,
pa_color), а не просто свойства. Для кастомных атрибутов используйте другой способ проверки. - Конфликты с кэшированием — если корзина ведёт себя некорректно, отключите кэширование страниц для корзины и оформления заказа.
- Код очищает корзину слишком часто — уточните условия в коде, чтобы не удалять товары без необходимости.
Практические советы по производительности и безопасности
- Не используйте очистку сессии на каждом запросе, это увеличит нагрузку и ухудшит UX. Лучше ограничить очистку определёнными страницами или событиями.
- Всегда тестируйте код в staging-среде, особенно если модифицируете корзину, чтобы не нарушить процесс оформления заказа.
- Для крупных магазинов с большим количеством атрибутов оптимизируйте проверку атрибутов, кэшируйте результаты, чтобы уменьшить количество запросов к базе.
- Если используете сторонние плагины управления атрибутами, убедитесь, что ваш код совместим с их API.
Сравнение способов управления корзиной в WooCommerce
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Отключение сессии WC()->session->destroy_session() | Полная очистка корзины и сессии пользователя | Простота реализации, полный сброс | Плохой UX, сброс корзины у всех пользователей |
| Удаление товаров по атрибутам в хуке | Удаляет специфичные товары из корзины | Гибко, выборочно, не трогает остальные товары | Нужно точно знать атрибуты, возможны конфликты |
| Использование плагинов для управления корзиной | Расширенные настройки, интерфейс | Удобство, поддержка, часто больше функций | Зависимость от плагина, возможное замедление |