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

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

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

Подготовка к автоматическому удалению заказов

Прежде чем внедрять автоматическое удаление, убедитесь в следующем:

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

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

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

<?php
// 1. Регистрируем задачу планировщика
add_action('wp', function() {
    if (!wp_next_scheduled('wc_delete_old_cancelled_orders')) {
        wp_schedule_event(time(), 'daily', 'wc_delete_old_cancelled_orders');
    }
});

// 2. Функция удаления заказов
add_action('wc_delete_old_cancelled_orders', function() {
    $days = 30; // сколько дней считать "старыми"
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => [
            [
                'column'    => 'post_date',
                'before'    => $date_threshold,
            ]
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $orders = get_posts($args);

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

// 3. Очистка при деактивации темы или плагина
register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wc_delete_old_cancelled_orders');
});
?>

Объяснение: скрипт регистрирует ежедневную задачу, которая ищет заказы со статусом cancelled, созданные более 30 дней назад, и удаляет их.

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

  • Для другого статуса замените 'post_status' => 'wc-cancelled' на нужный, например 'wc-failed' или 'wc-pending'.
  • Период меняется в переменной $days.

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

Чтобы проверить, что скрипт работает:

  1. Создайте тестовый заказ в нужном статусе с датой старше пороговой.
  2. Принудительно запустите Cron-задачу через плагин WP Crontrol или вручную вызвав хук:
do_action('wc_delete_old_cancelled_orders');

3. Проверьте, что заказ удалён в админке WooCommerce.

4. Для автоматической проверки смотрите в wp_cron логи или используйте плагин WP Crontrol, чтобы убедиться, что событие запланировано и выполняется.

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

  • Заказы не удаляются
    Причина: WP-Cron не срабатывает на сайте без трафика. Решение: настройте системный cron на сервере или используйте плагин WP Crontrol для принудительного запуска.
  • Удаляются не те заказы
    Причина: неверно указан статус или период в запросе.
    Проверьте правильность post_status и формат даты.
  • Производительность страдает при большом количестве заказов
    Решение: добавьте постраничную обработку, например, удалять по 100 заказов за один запуск.

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

  • Всегда делайте резервные копии перед удалением данных.
  • Удаляйте заказы только с проверенными статусами, чтобы не потерять важную информацию.
  • Используйте wp_delete_post($order_id, true) с флагом true, чтобы полностью удалить заказ, а не отправлять в корзину.
  • Для крупных магазинов используйте пакетную обработку заказов (по 50-100 штук за раз), чтобы избежать таймаутов.
  • Мониторьте логи ошибок сервера и WordPress для выявления сбоев в работе cron-задач.

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

МетодПлюсыМинусыПодходит для
Ручное удаление через админкуПросто, без кодаТрудозатратно при большом количествеМаленькие магазины
Плагин (например, WP Bulk Delete)Удобство, графический интерфейсДополнительные зависимости, нагрузкаСредние магазины
Автоматический скрипт на WP-CronАвтоматизация, гибкостьТребует навыков программированияСредние и крупные магазины
Как создать автоматические отчёты в WordPress с помощью Cron и WP-Cron
17.03.2026
Как добавить авторизацию по телефонному номеру в WordPress
21.03.2026
Как отключить Emoji в WordPress для ускорения сайта
13.04.2026
Как создать собственный виджет в WordPress с применением PHP и хуков
17.11.2025
Как создать адаптивные таблицы в WordPress
10.04.2026