WooCommerce: как эффективно очистить базу от старых корзин и заказов

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

С течением времени в базе данных WooCommerce накапливаются устаревшие корзины и заказы с разными статусами (например, отменённые, проваленные или просто заброшенные корзины). Это увеличивает вес базы, замедляет запросы и негативно влияет на производительность сайта, особенно при большом трафике и большом количестве товаров.

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

SELECT COUNT(*) FROM wp_woocommerce_sessions; -- количество активных сессий корзин

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-pending'); -- количество старых заказов с указанными статусами

SELECT COUNT(*) FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'shop_order') AND meta_key = '_customer_ip_address'; -- пример проверки метаданных заказов

Если количество записей превышает десятки тысяч, это повод для очистки.

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

1. Удаление старых сессий корзин WooCommerce

WooCommerce хранит данные корзин в таблице wp_woocommerce_sessions с привязкой по session_key и expiry. Автоматически сессии со временем удаляются, но не всегда эффективно.

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

function wpone_cleanup_old_woocommerce_sessions() {
    global $wpdb;
    $expiry_time = time() - 7 * DAY_IN_SECONDS; // 7 дней назад
    $table = $wpdb->prefix . 'woocommerce_sessions';

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

    if ( false !== $deleted ) {
        error_log("[WooCommerce Cleanup] Deleted $deleted old sessions.");
    }
}
add_action('wp_scheduled_cleanup', 'wpone_cleanup_old_woocommerce_sessions');

// Запускаем задачу раз в сутки
if ( ! wp_next_scheduled( 'wp_scheduled_cleanup' ) ) {
    wp_schedule_event( time(), 'daily', 'wp_scheduled_cleanup' );
}

2. Удаление старых заказов с определёнными статусами

Для удаления заказов со статусами cancelled, failed и pending, старше 30 дней, используйте WP_Query и функцию wp_delete_post():

function wpone_delete_old_shop_orders() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-failed', 'wc-pending'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'posts_per_page' => 100,
        'fields'         => 'ids',
    ];

    $query = new WP_Query($args);

    if ( $query->have_posts() ) {
        foreach ( $query->posts as $order_id ) {
            wp_delete_post( $order_id, true );
        }
        error_log('[WooCommerce Cleanup] Deleted ' . count($query->posts) . ' old orders.');
    }
}
add_action('wp_scheduled_order_cleanup', 'wpone_delete_old_shop_orders');

// Запуск задачи раз в неделю
if ( ! wp_next_scheduled( 'wp_scheduled_order_cleanup' ) ) {
    wp_schedule_event( time(), 'weekly', 'wp_scheduled_order_cleanup' );
}

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

  • Повторите SQL-запросы из раздела диагностики. Количество записей в таблицах wp_woocommerce_sessions и wp_posts с указанными статусами должно значительно снизиться.
  • Проверьте логи сервера или debug.log на наличие сообщений от функций очистки.
  • Оцените скорость загрузки страниц и время ответа базы данных до и после очистки.

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

  • Ошибка: Задачи wp_cron не запускаются автоматически.
    Причина: WP-Cron требует посещения сайта, на слабом трафике задачи не срабатывают.
    Решение: Настройте системный cron на сервере для вызова wp-cron.php каждые 15 минут.
  • Ошибка: Удаляются нужные заказы.
    Причина: Неправильно указаны статусы или дата.
    Решение: Проверьте аргументы WP_Query, используйте тестовый режим с логированием ID заказов перед удалением.
  • Ошибка: Переполнение таблицы wp_woocommerce_sessions несмотря на очистку.
    Причина: Плагины или кастомные решения создают сессии без ограничения срока.
    Решение: Проверьте сторонние плагины, отключите или исправьте логику сессий.

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

  • Перед удалением данных сделайте резервную копию базы.
  • Не удаляйте заказы со статусом processing или completed — это могут быть реальные продажи.
  • Очищайте базу пакетно, чтобы не перегружать сервер — например, по 100 записей за раз.
  • Используйте WP-Cron или системный cron для регулярной автоматизации очистки.
  • Проверьте индексы таблиц базы данных — наличие индексов по session_expiry и post_status ускорит операции удаления.

Сравнение вариантов очистки базы WooCommerce

МетодПлюсыМинусыКогда использовать
Ручное удаление через phpMyAdmin Мгновенный эффект, полный контроль Риск удаления нужных данных, требует навыков SQL Маленькие базы, единоразовая очистка
Автоматизированный скрипт на PHP с WP-Cron Безопасно, автоматизация, пакетная обработка Зависимость от Cron, требует настройки Регулярная очистка на больших сайтах
Плагины для очистки WooCommerce (Clearfy Pro) Удобный интерфейс, дополнительные опции Может нагрузить сайт, платные функции Пользователи без навыков кода, комплексное решение
Как удалить бесполезные мета данные из базы WordPress без потерь
12.01.2026
Автоматическое удаление ревизий постов в WordPress: практическое руководство
12.03.2026
Как использовать WPONE REST API для получения данных о заказах в WooCommerce
08.03.2026
Как удалить неиспользуемые роли и права в WordPress без рисков
04.02.2026
WooCommerce: как исправить ошибку неправильного отображения стоимости в корзине
08.06.2026