WooCommerce: автоматическое удаление товаров из корзины по таймеру

Диагностика проблемы с оставленными товарами в корзине WooCommerce

В интернет-магазинах на WooCommerce часто возникает ситуация, когда пользователи добавляют товары в корзину, но не оформляют заказ. Это приводит к "зависшим" корзинам, что может искажать статистику и создавать нагрузку на сервер, особенно если корзина хранится в сессии или базе данных. Встроенных механизмов автоматической очистки корзины по времени в WooCommerce нет, поэтому задача требует кастомного решения.

Пошаговое решение: как настроить автоматическое удаление товаров из корзины по таймеру

1. Добавляем метку времени при добавлении товара в корзину

Для отслеживания времени добавления товара в корзину нужно сохранить метку времени в сессии или в данных корзины. Используем хук woocommerce_add_to_cart:

add_action('woocommerce_add_to_cart', 'set_cart_item_timestamp', 10, 6); function set_cart_item_timestamp($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) { 	// Получаем объект корзины 	$cart = WC()->cart; 	if (!$cart) return; 	// Сохраняем время добавления как метаданные элемента корзины 	if (isset($cart->cart_contents[$cart_item_key])) { 		$cart->cart_contents[$cart_item_key]['added_time'] = time(); 	} }

2. Создаем функцию очистки корзины по таймеру

Теперь необходимо регулярно проверять корзину пользователя и удалять товары, которые были добавлены более, например, 30 минут назад.

function clear_old_cart_items() { 	if ( ! WC()->cart ) return; 	$cart = WC()->cart; 	$items = $cart->get_cart(); 	$changed = false; 	foreach ( $items as $cart_item_key => $cart_item ) { 		if ( isset($cart_item['added_time']) ) { 			$added_time = $cart_item['added_time']; 			if ( time() - $added_time > 30 * 60 ) { // 30 минут в секундах 				$cart->remove_cart_item($cart_item_key); 				$changed = true; 			} 		} 	} 	if ($changed) { 		$cart->calculate_totals(); 		WC()->session->set('cart', $cart->get_cart()); 	} }

3. Запускаем очистку при загрузке страницы

Чтобы функция срабатывала, добавим вызов очистки при инициализации WooCommerce на фронтенде:

add_action('wp_loaded', 'clear_old_cart_items');

Проверка результата после внедрения

Чтобы проверить, что автоматическое удаление работает, сделайте следующее:

  • Добавьте товар в корзину.
  • Откройте консоль браузера, чтобы отслеживать запросы, или добавьте error_log в функцию очистки для отладки.
  • Подождите 30 минут или измените время в коде на меньший интервал для теста.
  • Обновите страницу — товары, срок хранения которых истек, должны исчезнуть из корзины.

Частые ошибки и как их исправить

  • Товары не удаляются: Проверьте, что сессия WooCommerce корректно инициализирована, и функция clear_old_cart_items вызывается после загрузки корзины.
  • Время добавления не сохраняется: Убедитесь, что хук woocommerce_add_to_cart регистрируется правильно и что метка added_time добавляется в массив элемента корзины.
  • Удаление происходит слишком рано или поздно: Проверьте правильность расчёта времени в условии time() - $added_time > 30 * 60 — время задаётся в секундах.
  • Кеширование мешает обновлению корзины: Отключите серверное кеширование для страниц корзины и оформления заказа.

Практические советы по производительности и безопасности

  • Вызывайте функцию очистки только для аутентифицированных пользователей или только на страницах корзины/чекаута, чтобы не нагружать сайт лишними проверками.
  • Для улучшения UX можно добавить уведомление пользователю о том, что товары удалены из корзины из-за истечения времени.
  • Если магазин большой, рассмотрите перенос логики очистки в CRON-задачу сервера, которая будет чистить "зависшие" корзины в базе данных (для плагинов, которые используют сохранение корзины в базе).
  • Не храните метки времени в cookie или в публично доступных данных без шифрования, чтобы избежать манипуляций.

Альтернативные подходы: сравнение вариантов реализации

ПодходПлюсыМинусыУровень сложности
Очистка корзины при загрузке страницы (как в статье)Простое решение, не требует CRONЗависит от активности пользователя, не удалит товары в неактивных сессияхНизкий
CRON-задача на сервере для удаления старых корзинУдаляет все "зависшие" корзины, включая неактивныеТребует доступа к серверу и настройки CRONСредний
Использование специализированных плагинов (например, WooCommerce Cart Reports)Готовые функции, удобный интерфейсМожет быть избыточно и влиять на производительностьНизкий

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как автоматизировать размещение контента в WordPress с помощью WPRemark
10.04.2026
WooCommerce: удалить товар из корзины без перезагрузки страницы с экраном подтверждения
25.05.2026
Как использовать хук WooCommerce для обновления метаданных заказа при оформлении
17.07.2026
Как организовать журнал активности пользователей в WordPress с примерами кода и плагинов
26.01.2026
Как удалить разные типы скриптов и стилей из WordPress для улучшения производительности
27.04.2026
×
-15%
на премиум плагин
Clearfy

Защитите сайт!

Включить Clearfy »