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

Диагностика проблемы с накоплением заказов в WooCommerce

Магазины на WooCommerce со временем накапливают большое количество заказов, включая отменённые, просроченные или неактивные. Это замедляет работу базы данных, увеличивает размер дампов и усложняет администрирование. Нужно регулярно удалять такие заказы, но вручную это неудобно и неэффективно.

Типичные признаки проблемы:

  • Длительное время отклика при открытии списка заказов в админке.
  • Рост размера базы данных, особенно таблиц wp_posts и wp_postmeta.
  • Задержки при резервном копировании сайта.

Как настроить автоматическое удаление неактивных и старых заказов

Определяем критерии удаления

Под неактивными заказами обычно понимают статусы cancelled, failed и refunded. Старые заказы — это те, которым больше определённого срока, например 30 или 90 дней.

Пошаговое решение: добавляем крон-задачу и функцию удаления

WooCommerce не предлагает встроенного механизма массового удаления заказов по времени и статусу, поэтому создадим кастомный код в файле functions.php вашей темы или в собственном плагине.

1. Регистрируем крон-задачу, выполняющуюся ежедневно:

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

2. Создаём функцию удаления:

add_action('wc_delete_old_orders_daily', function() {
    $days = 30; // Период в днях для удаления заказов
    $statuses = array('cancelled', 'failed', 'refunded');

    $date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => $statuses,
        'date_query' => array(
            'before' => $date_limit,
            'inclusive' => true,
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // true - удаление без перемещения в корзину
        }
    }
    wp_reset_postdata();
});

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

register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wc_delete_old_orders_daily');
});

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

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

  • Проверьте наличие крон-задачи через плагин WP Crontrol.
  • Создайте тестовый заказ со статусом cancelled и датой старше 30 дней (можно через SQL в post_date изменить дату).
  • Запустите крон-задачу вручную через WP Crontrol или с помощью wp cron event run wc_delete_old_orders_daily в WP-CLI.
  • Убедитесь, что заказ удалён из базы, а в админке он не отображается.

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

  • Проблема: Крон-задача не запускается.
    Решение: Убедитесь, что на сайте включён WP-Cron, или настройте системный cron для вызова wp-cron.php. Проверьте регистрацию события и наличие задачи через WP Crontrol.
  • Проблема: Заказы не удаляются.
    Решение: Проверьте права пользователя, под которым выполняется скрипт. Убедитесь, что wp_delete_post вызывается с параметром true для полного удаления.
  • Проблема: Удаляются не те заказы.
    Решение: Проверьте правильность статусов в массиве $statuses и корректность даты в запросе.

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

  • Удаление большого количества заказов за раз может тормозить сайт. Если заказов много, разбейте процесс на партии по 50-100 штук, вызывая функцию несколько раз с пагинацией.
  • Резервное копирование базы данных перед внедрением автоматического удаления — обязательное условие.
  • Используйте wp_delete_post с параметром true для полного удаления, иначе данные могут остаться в базе.
  • Проверяйте логи сервера на наличие ошибок при работе крон-задачи.

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

МетодПреимуществаНедостатки
Плагин (например, Advanced Order Cleanup)Простота настройки, готовый интерфейсЗависимость от стороннего кода, возможные конфликты
Ручной SQL-запросБыстрота выполнения, прямой контрольРиск ошибок, отсутствие автоматизации
Кастомный код с WP-Cron (данный метод)Гибкость, автоматизация, интеграция с WPТребуется базовое знание PHP, настройка cron
Оптимизация изображений для WordPress: лучшие методы и плагины
10.11.2025
WooCommerce: как автоматически удалять нерабочие вариации товаров
05.05.2026
WooCommerce: как автоматически удалять старые заказы по срокам
11.06.2026
Как добавить и настроить автоматические сообщения в WordPress
24.12.2025
Как создать собственный виджет для WordPress
10.11.2025