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

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

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

Типичные сценарии:

  • Автоматическое удаление отменённых заказов старше 30 дней.
  • Удаление заказов со статусом «failed» для освобождения места.
  • Очистка тестовых заказов после разработки.

Как проверить, есть ли лишние заказы для удаления

В админке WooCommerce перейдите в «Заказы» и отфильтруйте по нужному статусу. Обратите внимание на количество и дату заказов. Также можно проверить через phpMyAdmin, выполнив запрос:

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

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

Реализуем функцию, которая будет запускаться по расписанию и удалять заказы с заданным статусом и старше определённого времени.

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

function wpnews_delete_orders_by_status() {
    $status = 'wc-cancelled'; // статус для удаления
    $days = 30; // удалять заказы старше 30 дней

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => $status,
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => "$days days ago",
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $orders = get_posts($args);
    if (empty($orders)) {
        return;
    }

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

2. Добавляем WP-Cron для периодического запуска

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

add_action('wpnews_daily_delete_orders', 'wpnews_delete_orders_by_status');

3. Очистка при деактивации темы или плагина

function wpnews_deactivate_cron() {
    $timestamp = wp_next_scheduled('wpnews_daily_delete_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpnews_daily_delete_orders');
    }
}
register_deactivation_hook(__FILE__, 'wpnews_deactivate_cron');

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

Чтобы убедиться, что задача работает:

  • Запустите вручную функцию wpnews_delete_orders_by_status() через консоль WP-CLI или временно вызовите в functions.php и проверьте, что заказы удалились.
  • Проверьте список заказов в админке WooCommerce — заказы с указанным статусом и старше 30 дней должны исчезнуть.
  • Через WP-Cron Manager (например, плагин WP Crontrol) убедитесь, что событие wpnews_daily_delete_orders запланировано и выполняется.

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

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

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

  • Всегда создавайте резервную копию базы перед автоматическим удалением данных.
  • Для больших магазинов с тысячами заказов разбивайте удаление на порции, чтобы избежать превышения лимита памяти и таймаута:
foreach (array_chunk($orders, 50) as $chunk) {
    foreach ($chunk as $order_id) {
        wp_delete_post($order_id, true);
    }
    sleep(1); // пауза для снижения нагрузки
}
  • Используйте плагин WP Crontrol для мониторинга и управления расписаниями cron.
  • Если нужны более сложные условия удаления (например, по метаданным заказа), используйте WP_Query с параметром meta_query.

Сравнение вариантов реализации автоматического удаления заказов

МетодПлюсыМинусы
WP-Cron с собственным кодомПолный контроль, без сторонних плагиновЗависит от посещаемости сайта, требует тестирования
Плагины очистки базы (например, WP Sweep)Простота использования, дополнительные функции очисткиМожет удалять больше или меньше, чем нужно, меньшая гибкость
Ручное удаление в админкеПростота, безопасностьНепрактично при большом количестве заказов
Как автоматизировать управление публикациями в WordPress
07.03.2026
Как избежать ошибки Allowed memory size в WordPress
29.11.2025
WooCommerce: как установить и настроить индивидуальные ценовые правила для ролей пользователей
26.05.2026
Как настроить индивидуальные ценовые правила в WooCommerce для разных ролей пользователей
13.05.2026
Как создать собственный блок в Gutenberg WordPress: практическое руководство
15.01.2026