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

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

В интернет-магазинах на WooCommerce иногда накапливаются заказы с неоплаченным статусом или зависшие в состоянии "заблокировано" (on-hold, failed, cancelled). Такие заказы занимают место в базе и влияют на производительность, особенно если их тысячи. Регулярная очистка избавит базу данных от мусора и ускорит работу сайта.

Как определить, какие заказы считаются заблокированными

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

  • on-hold — заказ ожидает оплаты;
  • failed — оплата не прошла;
  • cancelled — отменён пользователем или системой.

Рекомендуется уточнить, какие статусы у вас действительно нужно удалять, чтобы не затронуть важные заказы.

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

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

function wpaction_delete_old_blocked_orders() {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return; // WooCommerce не активен
    }

    $days_to_keep = 30; // сколько дней хранить заказы
    $date_limit = date( 'Y-m-d H:i:s', strtotime( "-{$days_to_keep} days" ) );

    $args = array(
        'limit' => -1,
        'status' => array( 'on-hold', 'failed', 'cancelled' ),
        'date_created' => '<' . $date_limit,
        'return' => 'ids',
    );

    $query = new WC_Order_Query( $args );
    $orders = $query->get_orders();

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

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

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

add_action( 'wpaction_daily_order_cleanup', 'wpaction_delete_old_blocked_orders' );

3. Размещение кода

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

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

  • Подождите выполнения задания WP-Cron (или запустите вручную через плагин WP Crontrol).
  • Проверьте, что заказы с указанными статусами и старше 30 дней удалились из базы (раздел WooCommerce → Заказы).
  • Для отладки можно временно добавить логирование количества удалённых заказов через error_log().

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

  • Функция не запускается по расписанию: WP-Cron работает только при посещении сайта. Для теста используйте плагин WP Crontrol или настройте реальный системный cron.
  • Потеря нужных заказов: Проверьте критерии фильтрации по статусам и дате, чтобы не удалить важные данные.
  • Удаление не происходит: Убедитесь, что WooCommerce активен и класс WC_Order_Query доступен.
  • Перегрузка при большом количестве заказов: Используйте параметр limit и запускайте удаление партиями, чтобы не превышать лимиты памяти и времени скрипта.

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

  • Всегда делайте резервную копию базы перед автоматическим удалением данных.
  • Ограничьте удаление заказов по дате, чтобы не потерять текущие транзакции.
  • Если база очень большая, настройте удаление партиями с параметрами limit и offset.
  • Для запуска WP-Cron используйте системный cron через wget или curl, чтобы гарантировать регулярность.
  • Логируйте результаты удаления для мониторинга работы и возможной отладки.

Сравнение вариантов автоматической очистки заказов WooCommerce

МетодПреимуществаНедостатки
Код своими силами через WP-CronПолный контроль, бесплатно, легко адаптироватьТребуется минимальный опыт, нужно следить за расписанием WP-Cron
Плагины очистки базыПростой интерфейс, дополнительные функцииМожет замедлять сайт, лишний плагин, ограниченная кастомизация
Удаление вручную через SQL-запросыБыстро, без нагрузки на сайтРиск ошибок, требует знаний SQL, нет автоматизации
WooCommerce: автоматическое удаление неактуальных вариантов товаров
01.06.2026
Как отключить REST API в WordPress для защиты сайта
13.02.2026
WooCommerce: как изменить цену товара на лету с помощью фильтров
04.06.2026
Как установить и настроить защиту от bruteforce-атак в WordPress без плагинов
21.04.2026
Как удалить по умолчанию скрипты и стили в WooCommerce для ускорения сайта
07.05.2026