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

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

Неактивные корзины и заказы накапливаются на сайте, занимая место в базе данных и замедляя работу магазина. Удаление таких записей помогает снизить нагрузку на сервер и ускорить запросы, особенно на больших проектах с высоким трафиком.

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

  • Проверьте количество заказов со статусом pending, failed или cancelled в WooCommerce.
  • Оцените, сколько корзин создалось без оформления заказа (например, сессии WooCommerce).
  • Проанализируйте базу данных на наличие устаревших записей wp_woocommerce_sessions и wp_posts с заказами в неподходящих статусах.

Для быстрой диагностики можно использовать SQL-запрос:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled');

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

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

WooCommerce хранит сессии в базе данных в таблице wp_woocommerce_sessions. По умолчанию сессии живут 48 часов (172800 секунд), но можно уменьшить этот срок.

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

add_action('woocommerce_cleanup_sessions', 'custom_cleanup_old_sessions');
function custom_cleanup_old_sessions() {
    global $wpdb;
    $expiration = time() - 24 * 60 * 60; // 24 часа назад
    $wpdb->query($wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
        $expiration
    ));
}

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

if (!wp_next_scheduled('custom_cleanup_sessions_hook')) {
    wp_schedule_event(time(), 'hourly', 'custom_cleanup_sessions_hook');
}
add_action('custom_cleanup_sessions_hook', 'custom_cleanup_old_sessions');

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

Заказы со статусами pending, failed и cancelled часто остаются в базе, если покупатель не завершил оплату. Можно регулярно удалять заказы старше определенного времени (например, 7 дней).

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

add_action('custom_delete_old_orders_hook', 'delete_old_unfinished_orders');
function delete_old_unfinished_orders() {
    $statuses = ['wc-pending', 'wc-failed', 'wc-cancelled'];
    $days = 7;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date,
            ]
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — без перемещения в корзину
    }
}

// Планируем крон
if (!wp_next_scheduled('custom_delete_old_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'custom_delete_old_orders_hook');
}

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

  • Проверьте таблицу wp_woocommerce_sessions: записи с session_expiry старше 24 часов должны отсутствовать.
  • В админке WooCommerce проверьте, что заказы со статусами pending, failed и cancelled старше 7 дней удалены.
  • Для теста можно вручную создать заказ с нужным статусом и датой, а затем запустить крон через WP-CLI:
    wp cron event run custom_delete_old_orders_hook

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

  • Неправильный префикс таблицы: в коде используйте глобальную переменную $wpdb->prefix, чтобы не было ошибок с нестандартными префиксами.
  • Удаление заказов без проверки зависимостей: если есть плагины, работающие с заказами, убедитесь, что удаление заказа не вызовет сбоев.
  • Крон не запускается: убедитесь, что WP-Cron активен и что сервер посещает сайт достаточно часто, либо настройте системный cron.
  • Удаление сессий приводит к разлогиниванию пользователей: не сокращайте срок жизни сессий слишком сильно — 24 часа — разумный минимум.

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

  • Всегда делайте резервную копию базы данных перед внедрением автоматического удаления данных.
  • Используйте wp_delete_post($id, true) с параметром true для полного удаления, чтобы не оставлять «мусор».
  • Планируйте задачи удаления в ночное время, чтобы не перегружать сервер в часы пик.
  • Для больших магазинов оптимизируйте запросы с помощью пагинации, чтобы не создавать нагрузку при удалении большого числа заказов.

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

МетодПреимуществаНедостаткиРекомендации
Плагины (например, WP-Cleaner)Простота использования, готовые настройкиМогут нагружать сервер, ограничены функционаломПодойдут для небольших сайтов
Ручной SQL-запросБыстро и эффективноРиск ошибок, отсутствие автоматизацииИспользовать с осторожностью и с бэкапом
Кастомный код с WP-Cron (предложенный)Автоматизация, гибкость, контрольНеобходимы базовые навыки программированияОптимальный для средних и больших магазинов
Создание своего шорткода в WordPress: практическое руководство
14.11.2025
Автоматическое добавление атрибутов и вариаций к товарам WooCommerce
25.04.2026
Автоматический анализ логов в WordPress: практические примеры и решения
04.01.2026
Автоматизация создания Sitemap в WordPress: практические решения и примеры
09.11.2025
WooCommerce: автоматическое создание атрибутов и вариаций к товарам через код
02.05.2026