WooCommerce: как автоматически удалять забытые товары в корзине

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

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

Основной вопрос: как автоматически очищать такие корзины, чтобы улучшить производительность и качество данных заказов?

Как работает сессия корзины в WooCommerce

WooCommerce хранит данные корзины в пользовательской сессии, которая связана с cookie. По умолчанию корзина сохраняется 48 часов после последнего действия пользователя, но это можно изменить.

Чтобы реализовать автоматическое удаление забытых товаров, нам нужно определить таймаут неактивности и очистить корзину после его истечения.

Настройка времени хранения корзины

Фильтр woocommerce_cart_session_expiration регулирует время жизни сессии корзины в секундах.

add_filter('woocommerce_cart_session_expiration', function() {
    // Устанавливаем время хранения корзины на 12 часов (43200 секунд)
    return 43200;
});

Измените значение в секундах, чтобы сократить или увеличить время хранения корзины.

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

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

В functions.php вашей темы или в кастомном плагине добавьте следующий код:

function custom_clear_abandoned_cart() {
    if ( is_user_logged_in() ) {
        $user_id = get_current_user_id();
        $last_activity = get_user_meta( $user_id, '_last_cart_activity', true );

        // Время неактивности в секундах (например, 6 часов)
        $timeout = 6 * 60 * 60;

        if ( $last_activity && ( time() - $last_activity ) > $timeout ) {
            WC()->cart->empty_cart();
            delete_user_meta( $user_id, '_last_cart_activity' );
        }
    } else {
        // Для гостей очищаем корзину, если сессия истекла
        if ( WC()->session ) {
            $cart_expiration = WC()->session->get_session_expiration();
            if ( $cart_expiration && time() > $cart_expiration ) {
                WC()->cart->empty_cart();
            }
        }
    }
}
add_action( 'wp_loaded', 'custom_clear_abandoned_cart' );

Этот код проверяет последнюю активность пользователя и очищает корзину, если прошло более 6 часов бездействия. Для гостей корзина очищается при истечении сессии.

2. Обновляем время последней активности корзины

Чтобы отслеживать активность, нужно обновлять мета-данные пользователя при каждом изменении корзины:

function update_last_cart_activity() {
    if ( is_user_logged_in() ) {
        update_user_meta( get_current_user_id(), '_last_cart_activity', time() );
    }
}
add_action( 'woocommerce_add_to_cart', 'update_last_cart_activity' );
add_action( 'woocommerce_cart_updated', 'update_last_cart_activity' );
add_action( 'woocommerce_remove_cart_item', 'update_last_cart_activity' );

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

  • Добавьте товар в корзину под своей учётной записью.
  • Подождите заданное время неактивности (можно временно уменьшить таймаут до 60 секунд для теста).
  • Обновите страницу или зайдите заново — корзина должна очиститься автоматически.
  • Для гостей очистка произойдет при истечении сессии (проверьте куки WooCommerce).

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

  • Корзина не очищается: Проверьте, что хуки подключены и код не конфликтует с другими плагинами или темой.
  • Время неактивности задано неправильно: Убедитесь, что таймаут в секундах указан корректно и соответствует ожиданиям.
  • Для гостей очистка не происходит: Убедитесь, что WooCommerce сессия корректно инициализирована (WC()->session).
  • Очистка происходит слишком рано: Проверьте, что обновление времени последней активности происходит при всех изменениях корзины.

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

  • Не используйте слишком короткий таймаут — это может раздражать пользователей.
  • Для больших магазинов лучше применить серверные решения по очистке сессий и корзин через WP-Cron или внешние задачи.
  • Не храните лишние данные в мета-полях пользователей, чтобы не перегружать базу.
  • Регулярно очищайте старые сессии и транзиенты через плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy), чтобы поддерживать базу данных в чистоте.

Таблица сравнения способов реализации очистки корзины

МетодПреимуществаНедостатки
Фильтр woocommerce_cart_session_expirationПростая реализация, меняет время сессииОчистка происходит только после истечения сессии, нет гибкой логики
Кастомный хук с проверкой активностиГибкая логика очистки, можно настроить таймаутНужен дополнительный код и тестирование
Плагины для abandoned cartДополнительный функционал, аналитикаМогут замедлять сайт, платные решения
WooCommerce: автоматическое удаление неоплаченных заказов через заданное время
17.07.2026
Создать и использовать собственный тип записи (Custom Post Type) в WordPress с примерами кода
14.01.2026
Удаление неиспользуемых таблиц из базы данных WordPress для оптимизации сайта
11.01.2026
Автоматическое отключение пингов и пингбэков в WordPress
08.03.2026
Как автоматизировать создание и обновление sitemap в WordPress
07.04.2026