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

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

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

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

  • снизить нагрузку на базу данных;
  • ускорить бэкапы и обновления;
  • уменьшить время отклика запросов в админке;
  • улучшить общую производительность сайта.

Как определить, что заказы можно удалять

Обычно удаляют заказы со статусом cancelled, failed или refunded, которые были созданы более 30 дней назад и не несут юридической необходимости для хранения.

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

Мы создадим функцию, которая будет запускаться раз в сутки и удалять заказы, соответствующие критериям. Для этого используем WP-Cron, чтобы не нагружать сервер.

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

function wps_delete_old_wc_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-cancelled', 'wc-failed', 'wc-refunded'),
        'date_query'     => array(
            array(
                'column'    => 'post_date',
                'before'    => '30 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $orders = get_posts($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true - принудительное удаление
        }
    }
}

2. Настраиваем WP-Cron для ежедневного запуска

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

3. Как добавить код

Добавьте оба блока в файл functions.php вашей дочерней темы или в собственный плагин. Не используйте основной файл темы, чтобы не потерять изменения при обновлении.

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

Для проверки:

  1. Создайте тестовые заказы с нужными статусами (отменённые, неудачные) и датой старше 30 дней (можно изменить дату в базе или создать с помощью SQL).
  2. Запустите вручную функцию wps_delete_old_wc_orders() через консоль WP-CLI или временно вызовите ее в коде.
  3. Проверьте, что заказы удалились из админки WooCommerce и из таблицы wp_posts.
  4. Убедитесь, что WP-Cron срабатывает: можно временно изменить расписание с 'daily' на 'hourly' для ускоренного теста.

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

  • Заказы не удаляются: Проверьте, что статусы заказов прописаны с префиксом wc- (например, wc-cancelled), а не просто cancelled.
  • WP-Cron не срабатывает: Если на сервере нет внешних посещений, WP-Cron может не запускаться. Для теста можно использовать плагин WP Crontrol или настроить системный cron для вызова wp-cron.php.
  • Удаляются нужные заказы: Проверьте фильтр по дате и статусам, чтобы не удалить актуальные заказы. Включите логирование ID удалённых заказов.

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

  • Безопасность: Используйте wp_delete_post($order_id, true) для полного удаления, иначе заказы уйдут в корзину (trash). Не удаляйте заказы со статусом processing или completed.
  • Производительность: При большом количестве заказов ограничьте количество удаляемых за раз (например, posts_per_page => 100) и запускайте функцию несколько раз с wp-cron или через AJAX.
  • Логирование: Для отладки добавьте лог в файл, например:
error_log('Удалён заказ ID: ' . $order_id);

Сравнение вариантов удаления заказов

МетодПреимуществаНедостатки
Ручное удаление через админкуПросто, не требует кодаНеэффективно при большом объёме
Плагины очистки базыАвтоматизация, удобный интерфейсДобавляют нагрузку, могут конфликтовать
Код на WP-Cron (описанный)Лёгкий, гибкий, без лишних плагиновНужно писать и тестировать код
WooCommerce: автоматическое удаление неактивных товаров по срокам
23.06.2026
Оптимизация базы данных WordPress: удаление старых ревизий и автоматизация процесса
22.12.2025
WooCommerce: автоматическое удаление неоплаченных заказов через код
12.07.2026
Как удалить порты в WordPress для блокировки внешних запросов
30.03.2026
Как использовать WP хуки для автоматизации обработки заказов WooCommerce
03.06.2026