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

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

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

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

  • Замедленная работа админ-панели WooCommerce, особенно при просмотре заказов.
  • Таблица wp_woocommerce_sessions занимает много места (проверяется через phpMyAdmin или инструменты хостинга).
  • Множество заказов в статусах cancelled, failed или pending, старше нескольких месяцев.
  • Регулярные бэкапы базы значительно увеличиваются в размере из-за накопленных данных.

Пошаговое решение: очистка старых корзин и заказов в WooCommerce

1. Очистка старых сессий (корзин) WooCommerce

WooCommerce хранит сессии пользователей в таблице wp_woocommerce_sessions. По умолчанию плагин сам очищает сессии старше 48 часов, но при большом трафике их накопление всё равно может вызывать проблемы.

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

add_action('init', function() {
    global $wpdb;
    $expiration = time() - 48 * 60 * 60; // 48 часов назад
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $deleted = $wpdb->query(
        $wpdb->prepare("DELETE FROM $table WHERE session_expiry < %d", $expiration)
    );
    if ($deleted !== false) {
        error_log("Удалено старых сессий WooCommerce: $deleted");
    }
});

Этот код удалит все сессии, срок действия которых истёк более 48 часов назад.

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

Заказы со статусами cancelled, failed, pending могут накапливаться месяцами. Чтобы очистить заказы старше, например, 90 дней, можно использовать WP-CLI или написать PHP-скрипт.

Пример скрипта для удаления заказов старше 90 дней со статусом cancelled:

function delete_old_cancelled_orders() {
    $args = [
        'limit' => -1,
        'status' => 'cancelled',
        'date_created' => '<' . ( new WC_DateTime() )->modify('-90 days')->date('Y-m-d H:i:s'),
        'return' => 'ids',
    ];
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}
add_action('init', 'delete_old_cancelled_orders');

Внимание: перед запуском на рабочем сайте обязательно сделайте резервную копию базы данных.

3. Автоматизация очистки с помощью WP-Cron

Чтобы не запускать очистку вручную, настройте планировщик на ежедневный запуск:

function schedule_woocommerce_cleanup() {
    if (!wp_next_scheduled('woocommerce_cleanup_event')) {
        wp_schedule_event(time(), 'daily', 'woocommerce_cleanup_event');
    }
}
add_action('wp', 'schedule_woocommerce_cleanup');

add_action('woocommerce_cleanup_event', function() {
    // Очистка сессий
    global $wpdb;
    $expiration = time() - 48 * 60 * 60;
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $wpdb->query($wpdb->prepare("DELETE FROM $table WHERE session_expiry < %d", $expiration));

    // Удаление старых отменённых заказов
    $args = [
        'limit' => -1,
        'status' => 'cancelled',
        'date_created' => '<' . ( new WC_DateTime() )->modify('-90 days')->date('Y-m-d H:i:s'),
        'return' => 'ids',
    ];
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
});

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

  • Проверьте размер таблицы wp_woocommerce_sessions в phpMyAdmin — он должен уменьшиться.
  • В админке WooCommerce проверьте количество заказов в статусах cancelled и pending — их должно стать меньше.
  • Логи PHP (если включены) покажут количество удалённых сессий и заказов.
  • Проверьте скорость загрузки страниц с заказами и общую нагрузку на базу данных.

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

  • Удаление заказов не происходит: возможно, неправильно указан статус заказа в параметрах запроса. Проверьте, что статусы соответствуют реальным.
  • Данные сессий не удаляются: убедитесь, что время сервера синхронизировано и код запускается (проверяйте логи).
  • Ошибка в SQL запросе: при использовании $wpdb->prepare важно правильно передавать параметры, иначе запрос не выполнится.
  • Повреждение данных: всегда делайте бэкап перед массовым удалением, чтобы можно было восстановить.

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

  • Запускайте очистку в периоды низкой нагрузки, чтобы не создавать пиковую нагрузку на базу.
  • Используйте WP-CLI для удаления заказов на больших сайтах — это быстрее и безопаснее, чем через PHP.
  • Ограничьте права доступа к файлам с кастомным кодом и используйте nonce для защиты при вызове функций из интерфейса.
  • Регулярно оптимизируйте таблицы базы данных с помощью OPTIMIZE TABLE или плагинов типа Clearfy Pro (ссылка), чтобы уменьшить фрагментацию и ускорить запросы.

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

МетодОписаниеПлюсыМинусы
Ручной SQL-запросПрямое выполнение запросов в базе через phpMyAdminБыстро, без дополнительного кодаРиск ошибки, необходимость знаний SQL, опасность повредить данные
PHP-скрипты с хукамиИспользование кода в functions.php или плагинахАвтоматизация, гибкость, интеграция с WordPressНужно тестировать, возможна нагрузка при неправильной настройке
WP-CLIКомандная строка для удаления заказов и сессийБыстро, эффективно на больших сайтах, безопасноТребует доступа к серверу и знаний командной строки
WooCommerce: как эффективно очистить базу от старых корзин и заказов
20.05.2026
Как создать автоматический импорт постов в WordPress из внешнего источника
17.03.2026
Как использовать AJAX в формах WordPress без плагинов
29.01.2026
Автоматическое удаление ревизий постов в WordPress: практическое руководство
12.03.2026
Как создать собственный блок для Gutenberg в WordPress
16.01.2026