Автоматическое удаление заброшенных корзин в WooCommerce по расписанию без плагинов

Что такое заброшенные корзины в WooCommerce и почему их нужно удалять

Заброшенные корзины — это сессии, в которых пользователи добавили товары, но не оформили заказ. Их накопление ведет к излишнему росту таблиц базы данных, снижению производительности и затрудняет аналитику. WooCommerce по умолчанию не удаляет такие корзины автоматически, поэтому нужно реализовать собственное решение.

Диагностика проблемы: как определить наличие заброшенных корзин

Корзины в WooCommerce хранятся в таблице wp_woocommerce_sessions (префикс может отличаться). В ней сохраняются сессии пользователей, в том числе и незавершённые корзины.

Чтобы проверить наличие старых заброшенных корзин, выполните в базе данных MySQL следующий запрос (подставьте ваш префикс таблиц):

SELECT session_key, session_value, session_expiry FROM wp_woocommerce_sessions WHERE session_expiry < UNIX_TIMESTAMP() - 86400;

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

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

1. Создаем функцию удаления просроченных сессий

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

2. Регистрируем периодическое задание WP-Cron

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

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

add_action( 'wc_delete_expired_sessions_event', 'wc_delete_expired_sessions' );

Здесь мы запускаем функцию очистки каждый час. Интервал можно менять, если требуется чаще или реже.

Как проверить, что удаление сработало

  • Выполните SQL-запрос из раздела диагностики до и после внедрения кода — количество просроченных сессий должно уменьшиться или равняться нулю.
  • Проверьте логи ошибок на наличие сообщений из error_log в случае проблем.
  • Проверьте таблицу wp_woocommerce_sessions в базе через phpMyAdmin или консоль — записи с session_expiry меньше текущего времени должны отсутствовать.

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

  • Cron-задача не запускается: Проверьте, что на сайте посещают страницы — WordPress запускает WP-Cron при загрузке страниц. Для 100% гарантии используйте системный cron или плагин WP Crontrol.
  • Неправильный префикс таблиц: Убедитесь, что используете правильный префикс в запросах, он совпадает с $wpdb->prefix.
  • Ошибка в SQL-запросе: Используйте $wpdb->prepare для безопасности и правильного формирования запроса.
  • Функция не добавлена в тему или плагин: Проверьте, что код находится в активном файле, а не в отключенной теме или неактивном плагине.

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

  • Удаляйте сессии с осторожностью — не удаляйте активные (с session_expiry в будущем), чтобы не прервать текущие заказы.
  • Для высокой нагрузки используйте системный cron вместо WP-Cron, чтобы гарантировать регулярное выполнение.
  • Логируйте ошибки удаления сессий для своевременного обнаружения проблем.
  • Если на сайте большое количество сессий, разбивайте удаление на порции, чтобы не перегружать базу:
function wc_delete_expired_sessions_batch() {
    global $wpdb;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $current_time = time();
    $batch_size = 1000;

    $expired_sessions = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT session_key FROM $table WHERE session_expiry < %d LIMIT %d",
            $current_time, $batch_size
        )
    );

    if ( ! empty( $expired_sessions ) ) {
        foreach ( $expired_sessions as $session_key ) {
            $wpdb->delete( $table, array( 'session_key' => $session_key ) );
        }
    }
}

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

МетодПреимуществаНедостатки
Использование WP-Cron и собственного кода Полный контроль, без плагинов, легко адаптируется Зависит от посещаемости сайта, требует базовых знаний SQL
Плагины (например, WP Optimize, Clearfy Pro) Простота настройки, дополнительные функции оптимизации Нагрузка на сайт, лишний код, возможные конфликты
Ручное удаление через базу данных Мгновенный эффект, без нагрузки на сайт Риски удаления нужных данных, требует доступа к БД
Автоматическое удаление заброшенных корзин в WooCommerce по расписанию
25.05.2026
Как удалить автозаголовки в WooCommerce без плагинов: практическое решение
09.06.2026
Решение проблемы неработающего фильтра товаров WooCommerce по атрибутам
28.05.2026
Как использовать hooks в WordPress для расширения функциональности
09.11.2025
Как автоматически удалять старые ревизии постов в WordPress для оптимизации базы данных
23.03.2026