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

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

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

Как настроить автоматическое удаление заказов по статусу и срокам

Использование WP-Cron для регулярной очистки

Для удаления заказов по заданным условиям без установки плагинов можно задействовать WP-Cron — штатный планировщик задач WordPress. Ниже приведён пример кода, который удаляет заказы со статусом cancelled и датой создания старше 30 дней.

function wc_auto_delete_old_cancelled_orders() {
    $args = array(
        'limit'        => -1,
        'status'       => 'cancelled',
        'date_created' => '<' . ( time() - MONTH_IN_SECONDS ),
        'return'       => 'ids',
    );

    $orders = wc_get_orders( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true );
        }
    }
}

add_action( 'wc_daily_order_cleanup', 'wc_auto_delete_old_cancelled_orders' );

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

Код можно добавить в файл functions.php вашей темы или в кастомный плагин. В данном примере удаляются заказы со статусом cancelled старше 30 дней (30 дней = MONTH_IN_SECONDS).

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

Чтобы удалить заказы с другим статусом, замените 'status' => 'cancelled' на нужный статус, например 'failed' или массив статусов array('failed', 'cancelled'). Для изменения срока используйте значение в секундах, например 7 дней — 7 * DAY_IN_SECONDS.

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

  • Убедитесь, что в базе есть заказы со статусом и датой старше установленного срока.
  • Проверьте, что событие wc_daily_order_cleanup запланировано через wp cron event list (можно использовать плагин WP Crontrol).
  • Принудительно вызовите функцию через админку или WP-CLI для теста: do_action('wc_daily_order_cleanup');
  • Проверьте, что заказы удалились (раздел WooCommerce - Заказы).

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

  • Удаление не происходит: проверьте, запущен ли WP-Cron. Если сайт не получает трафик, задачи могут не запускаться. Решение — настроить системный cron или запускать WP-Cron вручную.
  • Удаляются не те заказы: убедитесь, что статус заказа указан корректно и формат даты соответствует требованиям wc_get_orders().
  • Ошибка памяти или таймаута при удалении большого количества заказов: добавьте постраничное удаление заказов, например, по 50 за раз.

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

  • Удаляйте заказы с параметром force_delete = true в wp_delete_post() для полного удаления без перемещения в корзину.
  • Ограничьте количество удаляемых заказов за один запуск, чтобы не перегружать сервер.
  • Регулярно делайте резервные копии базы данных перед автоматическим удалением.
  • Для сайтов с большим трафиком рассмотрите использование системного cron для запуска WP-Cron.

Дополнительный пример: постепенное удаление заказов по страницам

function wc_paginated_order_deletion() {
    $args = array(
        'limit'  => 50,
        'status' => 'failed',
        'date_created' => '<' . ( time() - 14 * DAY_IN_SECONDS ),
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true );
        }
    }
}

add_action( 'wc_hourly_order_cleanup', 'wc_paginated_order_deletion' );

if ( ! wp_next_scheduled( 'wc_hourly_order_cleanup' ) ) {
    wp_schedule_event( time(), 'hourly', 'wc_hourly_order_cleanup' );
}

Этот код удаляет заказы со статусом failed старше 14 дней по 50 штук каждый час, уменьшая нагрузку на сервер.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаНепрактично для большого количества заказов, трудозатратно
Плагины (например, WooCommerce Order Cleaner)Удобный интерфейс, настройка без кодаДополнительная нагрузка, возможные конфликты, требует обновлений
Код на WP-Cron (как в статье)Гибко, без сторонних зависимостей, можно адаптировать под задачиТребует навыков, нужно контролировать работу cron, возможны ошибки при больших объёмах
WooCommerce: решение проблемы с непоявлением вариаций при использовании кэширования
11.05.2026
Как создать динамические категории в WordPress с помощью кода
19.01.2026
Как отключить или исправить AJAX жёсткое кэширование в WordPress
08.12.2025
Как использовать хуки для динамического изменения контента в WordPress
20.12.2025
Оптимизация базы данных WordPress: практические советы и примеры
14.11.2025

Сайт в разработке, скоро здесь будет портал о WordPress.