В чем суть задачи: зачем удалять товары из корзины автоматически
В стандартном WooCommerce товары в корзине остаются там, пока пользователь не очистит корзину, не оформив заказ, или пока не произойдет удаление сессии. Это может привести к нескольким проблемам: корзина засоряется устаревшими товарами, увеличивается нагрузка на сессии, а пользователи видят неактуальные данные. Автоматическое удаление товаров из корзины после заданного времени поможет поддерживать актуальность и поможет снизить нагрузку.
Диагностика проблемы: как понять, что нужна автоматизация удаления товаров из корзины
Если вы замечаете, что:
- Пользователи жалуются, что в корзине остаются товары, которые они давно добавили и забыли;
- Накопление товаров в корзинах влияет на производительность;
- Вы хотите повысить конверсию, мотивируя пользователей быстрее оформлять заказ;
тогда задача удаления товаров из корзины по времени — для вас.
Пошаговое решение: добавляем автоматическое удаление товаров из корзины по времени
1. Отслеживаем время добавления товара в корзину
WooCommerce не хранит напрямую время добавления товара в корзину. Для этого нам нужно сохранить timestamp при добавлении товара в сессию.
add_action('woocommerce_add_to_cart', 'wpfix_track_cart_item_time', 10, 6); function wpfix_track_cart_item_time($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) { $cart = WC()->cart->get_cart(); if (isset($cart[$cart_item_key])) { $cart[$cart_item_key]['added_time'] = time(); WC()->cart->cart_contents[$cart_item_key]['added_time'] = time(); } }2. Создаем функцию для удаления устаревших товаров из корзины
Будем проверять товары в корзине и удалять те, которые лежат дольше заданного времени (например, 30 минут).
function wpfix_remove_expired_cart_items() { if (!WC()->cart) return; $cart = WC()->cart->get_cart(); $now = time(); $expiration_seconds = 30 * 60; // 30 минут $removed = false; foreach ($cart as $cart_item_key => $cart_item) { if (isset($cart_item['added_time']) && ($now - $cart_item['added_time']) > $expiration_seconds) { WC()->cart->remove_cart_item($cart_item_key); $removed = true; } } if ($removed) { WC()->cart->calculate_totals(); } }3. Запускаем проверку при загрузке страниц сайта
Чтобы удаление срабатывало регулярно, добавим запуск проверки при инициализации WooCommerce.
add_action('woocommerce_before_cart', 'wpfix_remove_expired_cart_items'); add_action('woocommerce_before_checkout_form', 'wpfix_remove_expired_cart_items'); add_action('init', function() { if (is_admin()) return; wpfix_remove_expired_cart_items(); });Проверка результата после внедрения
- Добавьте товар в корзину и проверьте, что в массиве
WC()->cart->get_cart()для этого товара появляется полеadded_timeс текущим временем. - Подождите более 30 минут (или измените
$expiration_secondsна пару минут для теста), затем обновите страницу корзины — устаревший товар должен исчезнуть. - Проверьте, что при удалении товара обновляются итоги корзины.
Частые ошибки и их исправление
- added_time не добавляется к товарам: убедитесь, что хук
woocommerce_add_to_cartправильно подключен, и что корзина инициализирована. - Удаление не происходит: проверьте, что функция удаления запускается при загрузке страниц, где доступна корзина (cart, checkout).
- Нарушение работы сессии или кеширования: если сайт использует кеширование страниц или плагинов, убедитесь, что корзина не кешируется, иначе изменения не будут видны сразу.
- Время не обновляется при изменении количества товара: если пользователь изменяет количество, время не сбрасывается. Можно доработать обработчик для обновления
added_timeпри изменении количества.
Практические советы по производительности и безопасности
- Не запускайте функцию удаления на каждой странице без нужды, ограничьте хук страницами корзины и оформления заказа.
- Для сайтов с большой нагрузкой рассмотрите реализацию очистки корзин через WP-Cron, а не на каждой загрузке.
- Используйте защиту от кеширования страниц с корзиной (например, через заголовки
Cache-Control: no-cache). Это важно для корректной работы корзины. - Для расширения функционала можно интегрировать уведомления пользователей о том, что товары в корзине скоро будут удалены.
Сравнение подходов: код vs плагины
| Метод | Преимущества | Недостатки |
|---|---|---|
| Решение через код (как описано выше) | Легко кастомизируется, нет лишних функций, минимальная нагрузка | Требует навыков разработки, нужно тестировать при обновлениях WooCommerce |
| Плагины (например, WooCommerce Cart Expiration) | Готовое решение, настройка через интерфейс, поддержка разработчиков | Может содержать лишний функционал, потенциально увеличивает нагрузку, зависимости от обновлений |