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

Проблема: товары застревают в корзине и мешают конверсии

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

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

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

Проверка содержимого корзин в базе данных

SELECT session_key, session_value, session_expiry FROM wp_woocommerce_sessions ORDER BY session_expiry ASC LIMIT 10;

Здесь session_value содержит сериализованные данные корзины, а session_expiry — время истечения сессии.

Решение: добавление автоматической очистки корзины по времени

Реализуем функцию, которая будет запускаться по CRON и очищать корзины, в которых товары находятся дольше заданного времени (например, 24 часа).

Шаг 1. Создание функции очистки корзины

function wpfix_clear_old_woocommerce_carts() {
    global $wpdb;
    $expiration_time = 24 * HOUR_IN_SECONDS; // 24 часа
    $time_now = time();
    
    // Получаем все сессии WooCommerce
    $sessions = $wpdb->get_results("SELECT session_key, session_value, session_expiry FROM {$wpdb->prefix}woocommerce_sessions");

    foreach ($sessions as $session) {
        // Проверяем, истекло ли время хранения сессии
        if ($session->session_expiry < $time_now - $expiration_time) {
            $data = maybe_unserialize($session->session_value);
            if (!empty($data['cart']) && is_array($data['cart'])) {
                // Очищаем корзину
                $data['cart'] = [];
                $new_value = maybe_serialize($data);

                // Обновляем запись в базе
                $wpdb->update(
                    "{$wpdb->prefix}woocommerce_sessions",
                    ['session_value' => $new_value],
                    ['session_key' => $session->session_key]
                );
            }
        }
    }
}

Шаг 2. Регистрация CRON задачи

Создадим расписание для запуска очистки раз в час.

add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['hourly_custom'])) {
        $schedules['hourly_custom'] = [
            'interval' => 3600,
            'display' => __('Каждый час')
        ];
    }
    return $schedules;
});

if (!wp_next_scheduled('wpfix_hourly_clear_cart')) {
    wp_schedule_event(time(), 'hourly_custom', 'wpfix_hourly_clear_cart');
}

add_action('wpfix_hourly_clear_cart', 'wpfix_clear_old_woocommerce_carts');

Шаг 3. Очистка после успешной оплаты

WooCommerce по умолчанию очищает корзину после оплаты, но убедимся, что это работает корректно. Можно добавить хук для сброса корзины после заказа:

add_action('woocommerce_thankyou', function($order_id) {
    WC()->cart->empty_cart();
});

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

  • Добавьте товар в корзину и оставьте ее без оформления заказа более 24 часов.
  • Запустите вручную функцию wpfix_clear_old_woocommerce_carts() через консоль или временно вызовите ее в теме.
  • Проверьте таблицу wp_woocommerce_sessions, убедитесь, что корзина для соответствующей сессии обнулена.
  • Проверьте на фронтенде, что корзина очищена и пользователь видит пустую корзину.

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

  • CRON задача не запускается: убедитесь, что WordPress CRON активен, и что хук wpfix_hourly_clear_cart зарегистрирован. Для теста можете вызвать функцию вручную.
  • Корзина не очищается: проверьте, что в таблице wp_woocommerce_sessions есть записи, и что время session_expiry корректно обновляется.
  • Ошибка сериализации данных: используйте функции maybe_serialize и maybe_unserialize для работы с session_value.
  • Пользователь жалуется на удаление корзины слишком рано: скорректируйте значение $expiration_time в функции.

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

  • При работе с базой используйте подготовленные запросы (в нашем случае $wpdb->update безопасен, так как передаем данные напрямую).
  • Не запускайте функцию очистки слишком часто — это может повлиять на производительность.
  • Для сайтов с большой базой сессий стоит реализовать пакетную очистку с лимитом, чтобы не перегружать базу.
  • Для дополнительной безопасности ограничьте IP-доступ к административным страницам и используйте защиту от ботов, чтобы избежать спама с корзинами.

Сравнение вариантов решения

МетодОписаниеПлюсыМинусы
Плагин сторонний Использование готового плагина очистки корзины Быстрая настройка, поддержка Может нагружать систему, зависит от качества плагина
Кастомный код (наши примеры) Прямое управление сессиями и корзиной через код Легко контролировать, оптимизировать, гибко подстраивать Требует навыков программирования, поддержка на разработчике
Отключение сессий Полное удаление функционала сессий WooCommerce Упрощение, меньше нагрузки Потеря функционала корзины и пользовательского опыта
WooCommerce: как запретить добавление дубликатов товаров в корзину
04.05.2026
Автоматическая оптимизация изображений в WordPress при загрузке
03.01.2026
Как запретить доступ к файлам в WordPress через .htaccess
25.12.2025
WooCommerce: автоматическое удаление товаров из корзины по времени нахождения
04.06.2026
Как использовать WPCommunity для создания внутреннего портала на WordPress
07.02.2026