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

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

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

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

Подключение к WP Cron для регулярного запуска

Для автоматизации удаления заказов используем WP Cron — штатный планировщик задач WordPress. Запланируем задачу, которая будет запускаться, например, раз в сутки.

if ( ! wp_next_scheduled( 'wc_delete_old_orders_cron_hook' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_delete_old_orders_cron_hook' );
}

add_action( 'wc_delete_old_orders_cron_hook', 'wc_delete_old_orders' );

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

В функции мы будем искать заказы с нужными статусами, созданные раньше указанной даты, и удалять их без возможности восстановления (force delete). Пример ниже удаляет отменённые заказы старше 30 дней и неоплаченные старше 14 дней.

function wc_delete_old_orders() {
    $statuses = [
        'wc-cancelled' => 30, // отменённые старше 30 дней
        'wc-pending' => 14,    // ожидают оплаты старше 14 дней
    ];

    foreach ( $statuses as $status => $days ) {
        $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

        $args = [
            'status' => $status,
            'limit' => -1,
            'date_created' => '<' . $date_threshold,
            'return' => 'ids',
        ];

        $orders = wc_get_orders( $args );

        if ( ! empty( $orders ) ) {
            foreach ( $orders as $order_id ) {
                $order = wc_get_order( $order_id );
                if ( $order ) {
                    // Безопасное удаление заказа
                    wp_delete_post( $order_id, true );
                }
            }
        }
    }
}

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

Чтобы удостовериться в корректности работы, выполните следующие действия:

  • В админке WooCommerce перейдите в раздел «Заказы» и отметьте количество заказов с указанными статусами и датами.
  • Вручную запустите функцию wc_delete_old_orders() через WP CLI или добавив временный вызов в functions.php.
  • Обновите страницу заказов, проверьте, что старые заказы с нужными статусами удалены.
  • Проверьте логи ошибок сервера и WordPress на наличие сбоев.

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

  • Ошибка: Заказы не удаляются, хотя cron работает.
    Причина: Неправильный формат статусов (нужно указывать с префиксом wc-, например, wc-cancelled).
    Решение: Проверьте статус заказа через админку или кодом wc_get_order_statuses().
  • Ошибка: WP Cron не срабатывает.
    Причина: На вашем хостинге нет посещений сайта или отключён wp-cron.
    Решение: Настройте системный cron на вызов wp-cron.php или запускайте функцию вручную через WP CLI.
  • Ошибка: Ошибки в логах при удалении заказов.
    Причина: Некорректные объекты заказа или права доступа.
    Решение: Проверьте, что пользователь, от имени которого выполняется код, имеет права на удаление постов типа shop_order.

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

  • Безопасность: Используйте wp_delete_post( $order_id, true ) для полного удаления, убедитесь, что функция не вызывается случайно или без контроля, чтобы не удалить нужные данные.
  • Производительность: Ограничьте количество удаляемых заказов за один запуск, при необходимости добавьте пагинацию, чтобы не перегружать сервер.
  • Мониторинг: Логируйте удалённые заказы в файл, чтобы при необходимости восстановить информацию из резервной копии.

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

СпособПлюсыМинусы
Плагин (например, WP Bulk Delete)Готовое UI, удобствоДополнительная нагрузка, не всегда гибко
Код через WP Cron (как в статье)Полный контроль, без лишних плагиновТребует навыков, правильной настройки cron
Ручное удаление в админкеПросто, без кодаНе автоматизировано, долго при большом объёме
Как использовать хуки в WordPress для расширения функциональности
19.11.2025
Как отслеживать и решать проблемы с остановкой запросов в WordPress
12.02.2026
Как изменить размер изображений в WordPress без потери качества
26.01.2026
WooCommerce: автоматическое удаление отменённых заказов для оптимизации базы данных
05.05.2026
Как автоматически удалять старые чёрные спам-комментарии в WordPress
04.04.2026