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

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

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

Если в вашем магазине много таких заказов, стоит автоматизировать их удаление, чтобы поддерживать базу в чистоте и улучшить производительность.

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

По умолчанию WooCommerce использует стандартные статусы заказов, например, pending, processing, completed, cancelled, failed. Иногда магазины вводят свои кастомные статусы, например, blocked или используют определённый статус из списка.

Для начала определите, какие статусы считаются заблокированными в вашем магазине. Это можно сделать через админку WooCommerce > Статусы заказов или в плагинах, которые расширяют статусы.

Пример: допустим, заказы со статусом cancelled и failed считаются заблокированными, и их нужно удалять спустя 30 дней после создания.

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

Реализуем функцию, которая будет запускаться ежедневно и удалять заказы со статусами cancelled и failed, которым больше 30 дней.

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

function wpaction_delete_blocked_orders() {
    $statuses_to_delete = array('cancelled', 'failed');
    $days_to_keep = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    $args = array(
        'status' => $statuses_to_delete,
        'date_created' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — без перемещения в корзину
    }
}

2. Регистрируем ежедневное событие WP-Cron

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

add_action('wpaction_daily_delete_blocked_orders', 'wpaction_delete_blocked_orders');

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

function wpaction_unschedule_blocked_orders_cleanup() {
    $timestamp = wp_next_scheduled('wpaction_daily_delete_blocked_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpaction_daily_delete_blocked_orders');
    }
}
register_deactivation_hook(__FILE__, 'wpaction_unschedule_blocked_orders_cleanup');

Как проверить, что решение сработало

  • Создайте тестовый заказ в статусе cancelled или failed с датой создания более 30 дней назад (можно в базе вручную изменить дату).
  • Выполните вручную функцию wpaction_delete_blocked_orders() через консоль WP-CLI или временно вызовите её в шаблоне.
  • Проверьте, что заказ удалён из базы (раздел WooCommerce > Заказы и таблица wp_posts с post_type = 'shop_order').
  • Проверьте, что по расписанию (ежедневно) функция запускается автоматически — для этого можно временно изменить расписание на 'hourly' и отследить логи.

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

  • Ошибка: Функция ничего не удаляет.
    Причина: Неправильные статусы в массиве $statuses_to_delete или отсутствие заказов с такими статусами.
    Решение: Проверьте статусы заказов в базе, используйте отладку с выводом количества найденных заказов (error_log(count($orders))).
  • Ошибка: WP-Cron не запускается.
    Причина: На сайте мало трафика или запрещены запросы cron.
    Решение: Настройте системный cron на вызов wp-cron.php или используйте внешние сервисы для запуска cron.
  • Ошибка: Заказы удаляются некорректно или частично.
    Причина: Некорректный вызов wp_delete_post или ошибки в правах пользователя.
    Решение: Проверяйте, что функция вызывается с правами администратора, и используйте wp_delete_post($order_id, true) для полного удаления.

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

  • Перед удалением заказов делайте резервную копию базы данных.
  • Используйте ограничение по дате и статусу, чтобы не удалять актуальные данные.
  • Для магазинов с очень большим количеством заказов разбивайте удаление на порции, например, по 100 заказов за один запуск, чтобы избежать тайм-аутов.
  • Логируйте действия удаления для последующего аудита.
  • Отключите удаление заказов, если идут массовые распродажи или другие важные события.

Таблица сравнения вариантов удаления заблокированных заказов

СпособПлюсыМинусыПример
Плагин (например, WP Sweep)Готовое решение, интерфейсМожет удалять лишнее, нагрузкаWP Sweep — удаление ревизий и заказов
Код с WP-Cron (как в статье)Точный контроль, кастомизацияНужен кодинг, обслуживаниеСм. код выше
Ручное удаление в админкеПростота, без кодаТрудозатратно, риск забытьАдминка WooCommerce
Как создать автоматический импорт продуктов в WooCommerce из внешнего источника
07.02.2026
Как отключить автоматические обновления в WordPress с помощью кода
04.03.2026
Как создать автоматические сборки контента в WordPress
01.03.2026
Как разделить библиотеку медиаконтента в WordPress по категориям
26.02.2026
WooCommerce: как автоматически удалять заблокированные заказы для очистки базы
08.07.2026