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

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

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

Выбор критериев для удаления заказов

Перед удалением необходимо чётко определить:

  • Какие статусы заказов подлежат удалению (например, 'cancelled', 'failed', 'pending').
  • Заказы старше какого срока нужно удалять (например, 90 дней).
  • Нужно ли сохранять заказы с определёнными условиями (например, с возвратами или по VIP-клиентам).

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

Для автоматического удаления заказов создадим функцию, которая будет запускаться по крону WordPress. Эта функция удалит заказы по заданным статусам и возрасту.

1. Добавление кастомного крон-задачи

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

Этот код регистрирует ежедневное событие для удаления заказов.

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

add_action('wc_delete_old_orders_cron', function() {
    $statuses_to_delete = array('cancelled', 'failed', 'pending');
    $days_ago = 90; // удалять заказы старше 90 дней

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime('-' . $days_ago . ' days')),
    );

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'post_type' => 'shop_order',
            'post_status' => 'wc-' . $status,
            'date_query' => array($date_query),
            'fields' => 'ids',
            'posts_per_page' => -1,
        );

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // true для полного удаления
            }
        }
    }
});

Код получает ID заказов с нужным статусом и датой, затем удаляет их без возможности восстановления (без корзины WP).

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

  • Зайдите в админку WooCommerce → Заказы и отфильтруйте по статусам, по которым настроена очистка.
  • Проверьте, что заказы старше 90 дней отсутствуют.
  • Для отладки можно временно добавить логирование в файл, например, через error_log() внутри функции удаления.

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

  • Задача крон не запускается. Проверьте, активен ли WP-Cron, нет ли конфликтов с плагинами кеширования. Для теста вызовите функцию удаления вручную.
  • Заказы не удаляются. Убедитесь, что статусы указаны правильно (начинаются с 'wc-'). Проверьте права пользователя и что функция вызвана от имени администратора.
  • Удаляются нужные заказы. Проверьте фильтр даты и статусов, возможно, стоит добавить дополнительные условия, например, исключить VIP-клиентов по метаданным.

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

  • Не удаляйте заказы, которые могут понадобиться для отчетности или в налоговых целях.
  • Перед удалением можно сделать резервную копию базы данных.
  • Для больших магазинов не удаляйте все заказы сразу — делайте удаление партиями (пагинация).
  • Используйте wp_schedule_event только если у вас нет внешнего крона, иначе лучше настроить системный cron для стабильности.

Альтернативные методы: плагин vs код

МетодПреимуществаНедостатки
Самописный кодТочная кастомизация, нет лишних функций, полный контрольТребует навыков, возможны ошибки, нужно тестировать
Плагин (например, WP Bulk Delete)Простой интерфейс, можно использовать без программированияМожет нагружать сайт, меньше гибкости, лишний код

Чек-лист для внедрения автоматического удаления заказов в WooCommerce

  • Определить статусы заказов для удаления
  • Выбрать срок давности заказов
  • Реализовать код удаления с кроном
  • Протестировать работу на тестовом сайте
  • Сделать резервную копию базы
  • Внедрить на рабочем сайте
  • Проверить результаты в админке
  • Настроить логирование для мониторинга
Как отключить комментарии на отдельных страницах WordPress
31.03.2026
WooCommerce: как использовать хуки для точечной кастомизации шаблонов
02.06.2026
WooCommerce не отображает товары после обновления: как исправить
17.04.2026
WooCommerce: авторизация через телефон без плагинов
08.05.2026
Как автоматически удалять неиспользуемые meta данные в WordPress
24.02.2026