WooCommerce: как автоматически удалять старые корзины и неактивные заказы

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

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

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

  • Проверьте размер таблиц wp_woocommerce_sessions и wp_posts с заказами (post_type = 'shop_order') в вашей базе данных через phpMyAdmin или консоль.
  • Используйте SQL-запрос для подсчёта заказов по статусам, например:
    SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;
  • Обратите внимание на количество заказов со статусами pending, failed, cancelled старше 30 дней.
  • Проверьте таблицу сессий WooCommerce:
    SELECT COUNT(*) FROM wp_woocommerce_sessions;

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

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

WooCommerce хранит сессии в таблице wp_woocommerce_sessions. Для удаления сессий старше определённого времени можно использовать WP Cron и кастомный PHP-код.

function wc_clear_old_sessions() {
    global $wpdb;
    $expiration = time() - 60 * 60 * 24; // 1 день
    $table = $wpdb->prefix . 'woocommerce_sessions';
    $wpdb->query(
        $wpdb->prepare(
            "DELETE FROM $table WHERE session_expiry < %d",
            $expiration
        )
    );
}
add_action('wp_scheduled_clear_sessions', 'wc_clear_old_sessions');

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

2. Автоматическое удаление неактивных заказов

Удалять заказы нужно аккуратно, учитывая бизнес-логику. Обычно удаляют заказы со статусами cancelled, failed и pending, которые старше определённого срока.

function wc_delete_old_orders() {
    global $wpdb;
    $days = 30;
    $statuses = ['wc-cancelled', 'wc-failed', 'wc-pending'];
    $status_placeholders = implode(', ', array_fill(0, count($statuses), '%s'));
    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($status_placeholders) AND post_date < %s",
        ...$statuses, date('Y-m-d H:i:s', strtotime("-{$days} days"))
    );
    $order_ids = $wpdb->get_col($query);
    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // без корзины
    }
}
add_action('wp_scheduled_delete_orders', 'wc_delete_old_orders');

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

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

  • Через phpMyAdmin или консоль проверьте, уменьшилось ли количество записей в wp_woocommerce_sessions после 24 часов.
  • Проверьте количество заказов со статусами pending, failed, cancelled старше 30 дней — они должны быть удалены.
  • Для проверки Cron-задач используйте плагин WP Crontrol или команду WP-CLI wp cron event list, чтобы увидеть, запущены ли события wp_scheduled_clear_sessions и wp_scheduled_delete_orders.
  • Для моментального запуска задач без ожидания Cron можно вызвать функции вручную через консоль или добавить временный вызов:
wc_clear_old_sessions();
wc_delete_old_orders();

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

  • Удаление заказов не по статусу: Если изменить список статусов, можно случайно удалить активные заказы. Проверьте правильность статусов с префиксом wc-.
  • Проблемы с Cron: Если WP Cron не запускается из-за низкой посещаемости сайта, автоматическое удаление не сработает. Используйте системный cron через WP-CLI или внешние сервисы для запуска wp cron event run.
  • Потеря данных: Не тестируйте код сразу на продуктиве. Создайте резервную копию базы данных перед удалением заказов.
  • Неправильное время удаления сессий: Временной порог должен учитывать длительность сессии, по умолчанию WooCommerce хранит их 48 часов, лучше ставить 24-48 часов.

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

  • Очистку базы лучше делать в ночное время с минимальной нагрузкой на сервер.
  • Для масштабных магазинов с большим количеством заказов используйте пакетное удаление, чтобы не перегружать MySQL и PHP. Например, удалять по 100 заказов за один заход.
  • Включите логирование удаляемых заказов, чтобы можно было восстановить данные в случае ошибки.
  • Используйте плагин Clearfy Pro для дополнительной оптимизации и безопасной очистки базы WooCommerce.

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

МетодПреимуществаНедостаткиКомпромисс
Ручное удаление через базу (SQL)Быстро, без накладных расходовРиск удаления не тех данных, отсутствие бэкаповИспользовать только для опытных пользователей, с резервной копией
Код на PHP с WP CronАвтоматизация, безопасное удаление через WP APIЗависит от корректной работы WP CronДобавить системный cron для стабильности
Плагины оптимизации (Clearfy и др.)Удобство, дополнительные функции безопасностиМожет быть избыточным, требует лицензииИспользовать для комплексного решения и поддержки

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
WooCommerce: как убрать возможность изменять адрес доставки после оформления заказа
01.05.2026
Создать динамический список постов в WordPress с AJAX: практическое руководство
30.01.2026
Как отключить или ограничить AJAX-запросы в WordPress для повышения производительности
24.01.2026
Как создать уникальный виджет WordPress с настройками и примерами кода
28.11.2025
Как создать собственный шорткод в WordPress: подробное руководство
17.11.2025
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙