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

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

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

Задача: автоматизировать удаление заказов по определённому статусу (например, 'completed', 'cancelled') и по дате (старше 30, 60 дней и т.д.) с учётом безопасности и производительности.

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

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

Мы воспользуемся классом WC_Order_Query для выборки заказов и методом wp_delete_post() для их удаления.

function wps_delete_old_orders_by_status_date() {
    $statuses_to_delete = array('completed', 'cancelled'); // Статусы заказов для удаления
    $days_old = 60; // Кол-во дней, старше которых заказы будут удаляться
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    foreach ($statuses_to_delete as $status) {
        $query = new WC_Order_Query(array(
            'limit' => -1,
            'status' => $status,
            'date_created' => '<' . $date_threshold,
            'return' => 'ids',
        ));

        $order_ids = $query->get_orders();

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

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

Чтобы запускать очистку автоматически, добавим событие в WP-Cron, например, раз в сутки.

add_action('wps_daily_delete_old_orders', 'wps_delete_old_orders_by_status_date');

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

3. Как отменить планировщик при необходимости

function wps_clear_scheduled_order_deletion() {
    $timestamp = wp_next_scheduled('wps_daily_delete_old_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wps_daily_delete_old_orders');
    }
}

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

  • В админке WordPress переходите в WooCommerce > Заказы и фильтруйте по статусам 'completed' или 'cancelled'.
  • Проверьте, что заказы старше указанного срока (60 дней) удалены.
  • Для отладки можно временно добавить логирование в функцию удаления:
    error_log('Удалён заказ ID: ' . $order_id);
    и смотреть логи сервера.
  • Проверяйте работу WP-Cron с помощью плагина WP Crontrol, чтобы убедиться, что задача запускается.

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

  • Удаление не происходит: возможно, WP-Cron не работает из-за отсутствия посетителей сайта. Решение: настроить системный cron на сервере или запускать WP-Cron вручную.
  • Удаляются не те заказы: проверьте правильность указания статусов (используйте точные ключи WooCommerce, например 'completed', а не 'завершён').
  • Слишком долгий процесс удаления: если заказов много, удаляйте партии по 50-100 заказов за раз, чтобы избежать таймаутов. Для этого в запросе укажите 'limit' => 50 и запускайте функцию циклично.
  • Потеря данных важных заказов: добавьте резервное копирование перед удалением. Включите проверку даты и статуса, чтобы исключить случайные удаления.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, включая метаданные и связанные записи.
  • Добавьте проверку прав пользователя или условий запуска при ручном вызове, чтобы избежать несанкционированного удаления.
  • Рекомендуется запускать удаление в ночное время, чтобы снизить нагрузку на сервер.
  • Для больших магазинов рассмотрите удаление через WP-CLI — это быстрее и надёжнее.
  • Обязательно делайте резервное копирование базы данных перед внедрением автоматической очистки.

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

СпособПлюсыМинусыКогда использовать
Ручное удаление из админки Просто, не требует кода Много времени при большом объёме, риск ошибок Маленькие магазины, единичные случаи
PHP-скрипт с WP-Cron (как в статье) Автоматизация, гибкость, не требует сторонних плагинов Зависит от правильной настройки WP-Cron, нагрузка на сайт Средние и крупные магазины с регулярной очисткой
WP-CLI скрипт Быстро, эффективно для больших баз Требуется доступ к серверу и знания командной строки Большие магазины, системные администраторы
Как создать собственный шорткод в WordPress
05.11.2025
Изменение и удаление названия пользовательской роли в WordPress
30.12.2025
WooCommerce: как добавить поле для ввода серийного номера товара в корзине
06.05.2026
WooCommerce: как автоматически удалять неактивные товары через PHP-скрипт
23.05.2026
Как автоматизировать создание бэкапов в WordPress
14.11.2025