WooCommerce: как автоматически удалять заказы по статусу и дате

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

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

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

1. Создаем функцию для удаления заказов

Функция должна фильтровать заказы по нужному статусу и дате, а затем удалять их программно.

function wpd_delete_old_orders() {
    // Указываем статус заказов для удаления
    $target_status = 'cancelled'; // Можно заменить на 'failed', 'on-hold' и др.
    // Указываем дату: удаляем заказы старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    $args = array(
        'status' => $target_status,
        'limit' => -1,
        'date_created' => '<' . $date_threshold,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - без возможности восстановления
    }
}

2. Регистрируем WP-Cron задачу для регулярного запуска

Добавим хук для запуска функции, например, раз в сутки.

add_action('wpd_daily_order_cleanup', 'wpd_delete_old_orders');

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

3. Альтернатива: запуск через WP-CLI (если доступен)

Для больших магазинов лучше запускать очистку через WP-CLI, чтобы избежать таймаутов.

wp eval '
$orders = wc_get_orders([
    "status" => "cancelled",
    "limit" => -1,
    "date_created" => "<" . date("Y-m-d H:i:s", strtotime("-30 days")),
    "return" => "ids"
]);
foreach ($orders as $order_id) {
    wp_delete_post($order_id, true);
}
'

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

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

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

  • Заказы не удаляются: Проверьте правильность статуса в переменной $target_status. Он должен совпадать с реальными статусами WooCommerce (wc_get_order_statuses()).
  • Задача WP-Cron не запускается: Убедитесь, что на сайте есть трафик или используйте системный CRON для вызова wp-cron.php.
  • Удаление не происходит из-за прав: Функция wp_delete_post() требует прав администратора. Запускайте код от имени администратора или через CLI.
  • Перезапись событий WP-Cron: При частых изменениях проверяйте, что задача не дублируется, удаляйте старые через wp_clear_scheduled_hook().

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

  • Удаляйте заказы только после резервного копирования базы данных.
  • Для больших магазинов разбивайте удаление на пачки по 50-100 заказов, чтобы избежать таймаутов и нагрузки.
  • Для логирования используйте отдельный лог-файл, чтобы не засорять системный error_log.
  • Отключайте задачу, если магазин в пиковые периоды, чтобы не влиять на производительность.

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

МетодПреимуществаНедостатки
WP-CronАвтоматизация, не требует доп. настроек сервера, интегрируется с сайтомЗависит от посещаемости сайта, возможны задержки запуска
WP-CLIБыстро, надежно, можно запускать вручную или по системному CRONТребует SSH-доступа к серверу
Плагины очисткиУдобный интерфейс, дополнительные функцииПерегрузка сайта, лишний код, возможные конфликты
Как настроить отключение кеширования для отдельных страниц WooCommerce
07.05.2026
Как отключить кеширование в WooCommerce без плагинов: практическое руководство
23.04.2026
Как создать динамический файл robots.txt в WordPress
08.03.2026
Как отключить Emoji в WordPress без плагинов для ускорения сайта
23.02.2026
WooCommerce: автоматическое изменение цены и наличия товара по расписанию
21.07.2026