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

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

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

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

Для начала проверьте, сколько заказов с определёнными статусами скопилось в базе данных.

SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Обратите внимание на статусы wc-pending, wc-failed, wc-cancelled. Если их количество значительно (например, несколько тысяч), стоит настроить автоматическую очистку.

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

1. Выбор статусов и срока удаления

Решите, какие статусы считать неактивными. Обычно это pending, failed, cancelled. Также определите срок хранения, например, заказы старше 30 дней можно удалять.

2. Добавление кастомной функции и CRON-задачи

Добавьте в functions.php активной темы или в кастомный плагин следующий код, который раз в сутки будет удалять старые неактивные заказы.

function wpai_delete_old_inactive_orders() {
    $statuses = array('wc-pending', 'wc-failed', 'wc-cancelled');
    $date_before = date('Y-m-d H:i:s', strtotime('-30 days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'before' => $date_before,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — удалить без перемещения в корзину
        }
    }
}

// Регистрируем событие CRON, если не зарегистрировано
if (!wp_next_scheduled('wpai_delete_old_orders_cron')) {
    wp_schedule_event(time(), 'daily', 'wpai_delete_old_orders_cron');
}

// Хук на выполнение функции
add_action('wpai_delete_old_orders_cron', 'wpai_delete_old_inactive_orders');

3. Проверка работы CRON

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

function wpai_delete_old_inactive_orders() {
    error_log('Start deleting inactive orders: ' . date('Y-m-d H:i:s'));
    // ... остальной код
    error_log('End deleting inactive orders: ' . date('Y-m-d H:i:s'));
}

Логи будут в wp-content/debug.log, если включен WP_DEBUG_LOG.

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

  • Запустите CRON вручную (через WP-CLI или плагин WP Crontrol) командой: wp cron event run wpai_delete_old_orders_cron
  • Проверьте, что заказы с нужными статусами и датами удалились в таблице wp_posts.
  • Мониторьте количество заказов с помощью SQL-запроса из раздела диагностики.

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

  • CRON не срабатывает: убедитесь, что на сайте посещаются страницы, или настройте системный CRON для wp-cron.php.
  • Удаление не происходит: проверьте правильность статусов (нужно добавлять префикс wc-, например, wc-pending).
  • Удаляются неправильные заказы: проверьте аргументы date_query и статусы, чтобы не удалить активные или недавно созданные.
  • Ошибка памяти или превышение времени: ограничьте количество удаляемых заказов за один запуск, добавив параметр posts_per_page и реализовав постраничную обработку.

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

  • Всегда делайте резервную копию перед автоматическим удалением данных.
  • Используйте wp_delete_post($order_id, true) с параметром true, чтобы удалять заказы сразу, без корзины, во избежание накопления удалённых заказов.
  • Для крупных магазинов рекомендуем разбивать удаление на партии по 100-200 заказов за один CRON-запуск, чтобы избежать таймаутов.
  • Используйте плагин Clearfy Pro для профилактики и оптимизации базы данных, в том числе для удаления дублирующихся или старых записей.

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

МетодПлюсыМинусыПример
Ручное удаление через админку Простота, не требует кода Трудозатратно, риск пропуска WooCommerce → Заказы → Выбор и удаление
Плагин очистки заказов Автоматизация, удобный интерфейс Зависимость от стороннего кода, нагрузка Плагины типа "WooCommerce Order Cleaner"
Кастомный код с CRON Гибкость, точечное управление, без сторонних плагинов Требует навыков разработки, настройка CRON Код из статьи
Автоматизация создания Sitemap в WordPress: практические решения и примеры
09.11.2025
Автоматизация управления ролями в WordPress с помощью AI
01.04.2026
WooCommerce: автоматическое удаление закрытых и неактивных заказов через код
31.05.2026
Как создать автоматические заголовки для постов в WordPress с помощью AI
04.03.2026
WooCommerce: автоматическое удаление неактивных заказов через код
21.05.2026