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

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

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

Как определить забытые корзины

Забытые корзины — это сессии пользователей, у которых с момента последнего обновления корзины прошло определённое время (обычно более 30 дней), а заказ не был создан.

В таблице wp_woocommerce_sessions хранится информация о сессиях, включая поле session_expiry с UNIX-временем, когда сессия устаревает.

Пример запроса для просмотра устаревших сессий:

SELECT * FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));

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

  1. Создайте функцию для удаления устаревших сессий:
function wptest_delete_expired_woocommerce_sessions() {
    global $wpdb;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $threshold = time() - MONTH_IN_SECONDS; // 30 дней назад

    $deleted = $wpdb->query(
        $wpdb->prepare("DELETE FROM $table WHERE session_expiry < %d", $threshold)
    );

    if ( false === $deleted ) {
        error_log('Ошибка при удалении устаревших сессий WooCommerce.');
    } else {
        error_log("Удалено $deleted устаревших сессий WooCommerce.");
    }
}
  1. Добавьте задачу в WP-Cron для регулярного запуска:
// Регистрируем новое событие при активации темы или плагина
if ( ! wp_next_scheduled( 'wptest_delete_expired_sessions_event' ) ) {
    wp_schedule_event( time(), 'daily', 'wptest_delete_expired_sessions_event' );
}

// Привязываем функцию к событию
add_action( 'wptest_delete_expired_sessions_event', 'wptest_delete_expired_woocommerce_sessions' );
  1. Добавьте возможность отмены задачи при деактивации:
function wptest_deactivate_cleanup() {
    $timestamp = wp_next_scheduled( 'wptest_delete_expired_sessions_event' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wptest_delete_expired_sessions_event' );
    }
}
register_deactivation_hook( __FILE__, 'wptest_deactivate_cleanup' );

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

  • Подключитесь к базе данных через phpMyAdmin или другой инструмент и выполните запрос из раздела диагностики, чтобы убедиться, что устаревшие сессии удалены.
  • Проверьте логи сайта (error_log или debug.log), чтобы увидеть записи об удалении сессий.
  • Отслеживайте размер таблицы wp_woocommerce_sessions в течение недели — он должен не расти бесконтрольно.

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

  • Ошибка: Задача WP-Cron не запускается.
    Причина: Внешний вызов WP-Cron отключён или нет трафика на сайт.
    Решение: Настройте системный cron на сервере для вызова wp-cron.php или используйте плагины для мониторинга cron.
  • Ошибка: Недостаточно прав для удаления записей.
    Причина: Пользователь базы данных ограничен правами.
    Решение: Убедитесь, что у пользователя MySQL есть права DELETE для таблицы wp_woocommerce_sessions.
  • Ошибка: Ошибка SQL при выполнении запроса.
    Причина: Неправильное имя таблицы или синтаксис.
    Решение: Проверьте префикс таблиц в wp-config.php и убедитесь, что код использует правильный префикс.

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

  • Не удаляйте сессии чаще, чем раз в день — частый запуск может нагрузить базу.
  • Логируйте результаты удаления, но не храните логи слишком долго, чтобы избежать большого объёма лог-файлов.
  • Перед внедрением на продакшн протестируйте на копии сайта.
  • Если сайт большой, рассмотрите использование прямых SQL-запросов в отдельном скрипте, запускаемом по cron вне WordPress, чтобы снизить нагрузку.
  • Обновляйте WooCommerce и плагины, чтобы избежать несовместимости с API сессий.

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

МетодПлюсыМинусыКомпромисс
Плагин для очистки сессийПростота использования, готовый UIДополнительная нагрузка, возможные конфликтыИспользовать проверенные плагины с хорошими отзывами
WP-Cron с пользовательским кодомГибкость, точный контрольТребует навыков разработкиПротестировать на тестовом сервере
Скрипт на сервере (cron)Максимальная производительностьОтдельная настройка, вне WordPressИспользовать для очень крупных сайтов
Как избежать конфликтов между похожими плагинами в WordPress
03.02.2026
Как добавить автоматическое удаление старых записей через WP-Cron в WordPress
31.01.2026
Как запретить автозагрузку медиа-содержимого в WordPress для ускорения сайта
27.03.2026
Как отключить автообновления в WordPress без риска для сайта
18.03.2026
WooCommerce: как автоматически удалять забытые корзины и заказы
20.05.2026