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

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

В WooCommerce забытые корзины и незавершённые заказы накапливаются со временем, что приводит к росту размеров базы данных и снижению производительности сайта. Кроме того, такие данные могут забивать административную панель и затруднять аналитику реальных заказов.

Чтобы проверить наличие забытых корзин, выполните SQL-запрос к базе данных:

SELECT COUNT(*) FROM wp_woocommerce_sessions WHERE session_value LIKE '%cart%';

Для незавершённых заказов (статус "отменённый", "ожидание оплаты" более X дней):

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Если число таких записей велико, пора автоматизировать их удаление.

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

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

WooCommerce хранит данные корзин в таблице wp_woocommerce_sessions. Чтобы удалять сессии старше определённого срока (например, 7 дней), создадим WP-Cron задачу.

function delete_old_woocommerce_sessions() {
    global $wpdb;
    $interval = 7 * DAY_IN_SECONDS;
    $time_limit = time() - $interval;
    $sessions = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT session_key, session_expiry FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
            $time_limit
        )
    );

    foreach ($sessions as $session) {
        $wpdb->delete(
            "{$wpdb->prefix}woocommerce_sessions",
            ['session_key' => $session->session_key]
        );
    }
}

// Планируем cron, если ещё не запланирован
add_action('wp', function() {
    if (!wp_next_scheduled('delete_old_woocommerce_sessions_hook')) {
        wp_schedule_event(time(), 'daily', 'delete_old_woocommerce_sessions_hook');
    }
});
add_action('delete_old_woocommerce_sessions_hook', 'delete_old_woocommerce_sessions');

Автоматическое удаление старых незавершённых заказов

Заказы в статусах wc-pending, wc-cancelled можно удалять через WP-Cron, если они старше 30 дней.

function delete_old_pending_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-cancelled'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '30 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}

// Планируем cron задачу
add_action('wp', function() {
    if (!wp_next_scheduled('delete_old_pending_orders_hook')) {
        wp_schedule_event(time(), 'daily', 'delete_old_pending_orders_hook');
    }
});
add_action('delete_old_pending_orders_hook', 'delete_old_pending_orders');

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

  • Запустите вручную функции, если хотите проверить сразу:
delete_old_woocommerce_sessions();
delete_old_pending_orders();
  • Через phpMyAdmin или через консоль посмотрите количество записей в wp_woocommerce_sessions и постов типа shop_order в соответствующих статусах.
  • Проверьте, что WP-Cron задачи запланированы командой WP CLI:
    wp cron event list --fields=hook,next_run

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

  • WP-Cron не срабатывает: Если на сайте низкий трафик, WP-Cron может не запускаться. Используйте системный cron или плагин WP Crontrol для проверки и запуска задач вручную.
  • Удаление не работает из-за прав доступа: Убедитесь, что пользователь, под которым работает код, имеет права на удаление постов.
  • Удаляются важные заказы: Проверьте корректность фильтра статусов и даты, чтобы не удалить активные или важные заказы.
  • Дублирование задач в WP-Cron: Перед добавлением планирования проверьте, что задача ещё не запланирована, как показано в коде.

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

  • Запускайте удаление только по расписанию, избегайте выполнения при каждом запросе.
  • Перед удалением сделайте резервную копию базы данных.
  • Для крупных магазинов оптимизируйте выборку и удаление партиями, чтобы не превышать лимиты памяти и времени выполнения скриптов.
  • Регулярно очищайте и оптимизируйте таблицы базы данных (например, wp_woocommerce_sessions), используя оптимизационные плагины или SQL-запросы.
  • Используйте плагин Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wptest.ru&utm_medium=article&utm_campaign=woocommerce-kak-ustanovit-avtomaticheskoe-udaleniye-zabytyh-korziny-i-zakazov для дополнительной очистки и оптимизации WooCommerce.

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

МетодПлюсыМинусыКомпромисс
Ручное удаление через админкуПростота, безопасностьТрудозатратно, неэффективно при большом объёмеИспользовать для мелких магазинов
WP-Cron с собственным кодомАвтоматизация, гибкость, нет сторонних зависимостейWP-Cron зависит от посещаемости сайта, требует тестированияПодключить системный cron для надёжности
Плагины для очистки и оптимизацииПростота настройки, дополнительные опцииМогут нагружать базу, иногда платныеИспользовать вместе с кастомным кодом для максимальной эффективности
WooCommerce: как автоматически удалять забытые заказы и корзины
13.05.2026
Автоматическое удаление старых записей в WordPress через WP-Cron
30.03.2026
Как удалить старые вариации товара в WooCommerce
19.04.2026
Как автоматизировать удаление старого контента в WordPress без плагинов
14.03.2026
Как настроить автоматическое удаление забытых корзин в WooCommerce
10.05.2026