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

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

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

Чтобы проверить, насколько старая и большая таблица сессий, выполните SQL-запрос по базе данных:

SELECT COUNT(*) AS session_count, MIN(session_expiry) AS oldest_expiry, MAX(session_expiry) AS newest_expiry FROM wp_woocommerce_sessions;

Здесь вы увидите количество сохранённых сессий, а также временные метки самой старой и новой сессий. Если число сессий очень велико и есть просроченные сессии, это сигнал к очистке.

Почему автоматическое удаление старых корзин важно

  • Уменьшение размера таблиц в базе данных.
  • Ускорение запросов при работе с сессиями WooCommerce.
  • Снижение нагрузки на сервер при выполнении операций с корзинами.
  • Повышение стабильности и производительности сайта.

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

1. Понимание механизма хранения сессий WooCommerce

WooCommerce хранит сессии в таблице wp_woocommerce_sessions с полями:

  • session_key — уникальный ключ сессии.
  • session_value — сериализованные данные корзины и прочие данные.
  • session_expiry — timestamp, когда сессия должна истечь.

Сессии с истекшим session_expiry можно удалять без риска.

2. Создание функции для удаления старых сессий

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

function wptemp_delete_expired_woocommerce_sessions() {
    global $wpdb;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $time = time();
    $deleted = $wpdb->query( $wpdb->prepare( "DELETE FROM $table WHERE session_expiry < %d", $time ) );
    if ( false === $deleted ) {
        error_log('Ошибка при удалении просроченных сессий WooCommerce');
    } else {
        error_log("Удалено сессий WooCommerce: $deleted");
    }
}

3. Запуск функции через WP-Cron для регулярной очистки

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

if ( ! wp_next_scheduled( 'wptemp_delete_expired_sessions_cron' ) ) {
    wp_schedule_event( time(), 'hourly', 'wptemp_delete_expired_sessions_cron' );
}

add_action( 'wptemp_delete_expired_sessions_cron', 'wptemp_delete_expired_woocommerce_sessions' );

Этот код запускает очистку один раз в час. При необходимости интервал можно изменить на 'twicedaily' или 'daily'.

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

  • Подключитесь к базе данных и выполните запрос из раздела диагностики. Количество записей в wp_woocommerce_sessions должно уменьшиться.
  • Проверьте логи PHP (error_log) на наличие сообщения об удалённых сессиях.
  • Проследите за производительностью сайта и временем загрузки страниц с корзиной.
  • Можно временно добавить отладочный вывод в функцию для проверки удаления:
function wptemp_delete_expired_woocommerce_sessions() {
    global $wpdb;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $time = time();
    $deleted = $wpdb->query( $wpdb->prepare( "DELETE FROM $table WHERE session_expiry < %d", $time ) );
    if ( false === $deleted ) {
        error_log('Ошибка при удалении просроченных сессий WooCommerce');
    } else {
        error_log("Удалено сессий WooCommerce: $deleted");
    }
}

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

  • Ошибка: функция не вызывается в назначенное время.
    Проверьте, активен ли WP-Cron. На некоторых хостингах cron отключён. Можно настроить системный cron для вызова wp-cron.php или использовать плагин для управления wp-cron.
  • Ошибка: удаление не происходит или таблица не существует.
    Проверьте префикс таблиц в базе данных. Возможно, у вас отличается $wpdb->prefix. Можно явно указать имя таблицы в $table.
  • Ошибка: удаляются активные сессии.
    Убедитесь, что вы используете правильное сравнение session_expiry < time(). Никогда не удаляйте сессии с будущим временем истечения.
  • Замедление сайта после добавления функции.
    Оптимизируйте запрос, добавьте индекс на поле session_expiry в базе данных, если его нет.

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

  • Не запускайте удаление сессий слишком часто — чаще часа не требуется, чтобы не создавать лишнюю нагрузку.
  • Логируйте ошибки, но не выводите их в публичный доступ.
  • Создайте резервную копию базы данных перед внедрением автоматических удалений.
  • Следите за размером таблицы wp_woocommerce_sessions регулярно, чтобы вовремя реагировать на рост.
  • Если у вас большой магазин, рассмотрите использование внешних инструментов кеширования и оптимизации сессий.

Сравнение вариантов удаления старых корзин WooCommerce

МетодОписаниеПлюсыМинусы
Ручное удаление через SQL Выполнение DELETE запросов вручную в базе Простота, не требует кода Не автоматизировано, требует доступа к базе
WP-Cron с кастомной функцией (код из статьи) Автоматическая очистка по расписанию Автоматизация, гибкость, нет зависимостей от плагинов Зависимость от работы WP-Cron, требует базовой настройки
Плагины для очистки базы Утилиты типа WP-Optimize, которые удаляют сессии Удобный интерфейс, много функций Перегруженность функциями, возможные конфликты, лишний вес
Как удалить старые отзывы WooCommerce без плагинов
01.08.2026
Как использовать WP_Temp для работы с временными данными в WordPress
15.04.2026
Как создать автоматический импорт данных в WordPress без плагинов
01.04.2026
WooCommerce: автоматическое удаление пустых корзин без плагинов
29.07.2026
Как удалить пустые и неактивные регистрации пользователей в WordPress
20.01.2026