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

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

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

Основные признаки необходимости автоматизации

  • Много заказов со статусом cancelled, failed, pending старше 30 дней
  • Замедление запросов к базе из-за большого количества записей в таблицах wp_posts и wp_postmeta
  • Проблемы при резервном копировании из-за большого объема данных
  • Отсутствие регулярного обслуживания базы данных

Пошаговое решение: автоматическое удаление заказов по статусу и времени с помощью WP-Cron

Мы создадим задачу WP-Cron, которая будет запускаться ежедневно и удалять заказы с определёнными статусами старше заданного времени. Для этого используем стандартные функции WooCommerce и WordPress.

1. Регистрация ежедневного события WP-Cron

add_action('wp', function() {
    if (!wp_next_scheduled('wc_auto_delete_old_orders')) {
        wp_schedule_event(time(), 'daily', 'wc_auto_delete_old_orders');
    }
});

2. Основная функция удаления заказов

add_action('wc_auto_delete_old_orders', function() {
    $statuses_to_delete = ['cancelled', 'failed', 'pending'];
    $days_old = 30; // заказы старше 30 дней

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    foreach ($statuses_to_delete as $status) {
        $args = [
            'limit' => -1,
            'status' => $status,
            'date_created' => '<' . $date_threshold,
            'return' => 'ids',
        ];

        $orders = wc_get_orders($args);

        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — принудительное удаление
        }
    }
});

3. Добавление кода в functions.php или отдельный плагин

Рекомендуется добавлять код в кастомный плагин или использовать mu-плагин, чтобы избежать потери кода при обновлениях темы.

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

  • Запустите задачу вручную (например, через плагин WP Crontrol или WP-CLI): wp cron event run wc_auto_delete_old_orders
  • Проверьте в админке WooCommerce — заказы со статусами cancelled, failed, pending старше 30 дней должны исчезнуть
  • Проверьте таблицы wp_posts и wp_postmeta на уменьшение количества записей
  • Включите логирование ошибок PHP (если не уверены, что функция отработала корректно)

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

  • Крон не запускается: убедитесь, что на сайте есть трафик (WP-Cron зависит от посещений) или настройте системный cron для вызова wp-cron.php
  • Удаление не происходит, заказы остаются: проверьте правильность статусов и даты в запросе, убедитесь, что используете wc_get_orders с параметром return => 'ids'
  • Удаление происходит, но мета-данные остаются: wp_delete_post($order_id, true) удаляет все связанные данные, если используется с принудительным удалением, иначе используйте дополнительное удаление метаданных вручную
  • Производительность падает при большом количестве заказов: ограничьте количество удаляемых заказов за один запуск с помощью limit, например, 100, и используйте повторные вызовы

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

  • Всегда делайте резервную копию базы перед внедрением автоматического удаления
  • Добавьте логирование удалённых заказов в отдельный файл для аудита:
function wc_log_deleted_order($order_id) {
    $log_file = WP_CONTENT_DIR . '/deleted_orders.log';
    $entry = date('Y-m-d H:i:s') . " - Order deleted: #" . $order_id . "\n";
    file_put_contents($log_file, $entry, FILE_APPEND);
}

// Внутри цикла удаления
wp_delete_post($order_id, true);
wc_log_deleted_order($order_id);
  • Для очень больших баз используйте WP-CLI для пакетного удаления заказов по частям
  • Разделяйте заказы по статусам и времени, чтобы не перегружать сервер одной большой операцией
  • Проверяйте, что заказ не участвует в активных процессах (например, возврат или спор), перед удалением

Сравнение вариантов удаления заказов WooCommerce

МетодПростота внедренияКонтроль и безопасностьПроизводительностьКомпромиссы
Ручное удаление через админкуОчень простоПолный контроль, но требует времениНизкая при большом объёмеТрудозатратно и не автоматично
WP-Cron с кастомным кодомСредне (нужны базовые навыки)Хороший контроль, можно логироватьСредняя, зависит от реализацииWP-Cron зависит от трафика
WP-CLI скриптыСложно для новичковМаксимальный контроль, пакетная обработкаВысокая, подходит для больших базТребует доступа к серверу
Плагины очистки базыОчень простоОграниченный контроль, возможны ошибкиСредняяМогут удалять лишнее, нет гибкости
Автоматическое удаление заказов WooCommerce по статусу и времени
10.07.2026
Как создать бесплатный плагин WordPress с нуля: пошаговое руководство
30.11.2025
Как автоматически проверять здоровье сайта WordPress с помощью WPUnit
16.04.2026
Как использовать REST API для автоматического создания и обновления товаров WooCommerce
20.04.2026
Как использовать хуки в WordPress: практические примеры и советы
27.11.2025