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

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

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

Как понять, что это ваша проблема?

  • Рост таблицы wp_posts с типом shop_order.
  • Большое количество заказов со статусом cancelled в WooCommerce.
  • Замедленная работа админки при просмотре заказов.

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

Для удаления отменённых заказов, которым больше определённого количества дней, оптимально использовать планировщик задач WordPress (WP-Cron). Ниже пример кода, который:

  • Ищет заказы со статусом cancelled, старше 30 дней.
  • Удаляет эти заказы вместе с метаданными.
  • Запускается ежедневно.

Добавление кода в файл functions.php или в кастомный плагин

if ( ! wp_next_scheduled( 'delete_old_cancelled_orders_daily' ) ) {
    wp_schedule_event( time(), 'daily', 'delete_old_cancelled_orders_daily' );
}

add_action( 'delete_old_cancelled_orders_daily', 'delete_old_cancelled_orders' );

function delete_old_cancelled_orders() {
    $days = 30; // Удалять заказы старше 30 дней
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = [
        'status' => 'cancelled',
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // Полное удаление
    }
}

Как работает код

  • wp_schedule_event регистрирует задачу на ежедневный запуск.
  • wc_get_orders получает отменённые заказы старше 30 дней.
  • wp_delete_post удаляет заказ и связанные данные навсегда.

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

  1. Выполните вручную запуск задачи для проверки (см. ниже).
  2. Проверьте таблицу wp_posts на наличие заказов со статусом cancelled старше 30 дней.
  3. Убедитесь, что эти заказы удалены.
  4. Проверьте, что на странице заказов в админке отображается корректное количество.

Запуск задачи вручную для теста:

do_action( 'delete_old_cancelled_orders_daily' );

Этот вызов можно сделать в консоли WP-CLI или временно добавить в код для отладки.

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

  • Задача WP-Cron не запускается: проверьте, что WP-Cron включён (константа DISABLE_WP_CRON не установлена в true). На некоторых хостингах WP-Cron не работает без реального трафика — настройте системный cron или запускайте вручную.
  • Удаление не происходит из-за прав: убедитесь, что пользователь, под которым выполняется скрипт, имеет права на удаление постов.
  • Неверный статус заказа: статус должен быть точно cancelled, без пробелов и в нижнем регистре.
  • Производительность при большом числе заказов: если заказов слишком много, стоит добавить пагинацию в выборку.

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

  • Используйте limit и пагинацию при выборке, чтобы не перегружать сервер.
  • Перед удалением сделайте резервную копию базы данных.
  • Запускайте задачу в тихое время суток, чтобы минимизировать влияние на пользователей.
  • Для контроля логируйте удалённые заказы в отдельный файл.
  • Если у вас большой магазин, рассмотрите использование WP-CLI для пакетных операций.

Сравнение вариантов удаления отменённых заказов

ВариантПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудоёмко при большом количестве заказов, риск пропуска
Плагин с автоматическим удалениемАвтоматизация, удобствоЗависимость от стороннего кода, возможные конфликты
Кастомный код с WP-Cron (наш вариант)Гибко, контролируемо, без плагиновТребует знаний, настройка WP-Cron
Как удалить заблокированные пользователи WordPress
18.02.2026
WooCommerce: как автоматически удалять неактивные вариации товаров без плагинов
06.06.2026
Как избежать конфликтов между плагинами в WordPress
07.02.2026
Как удалить неактивных пользователей WordPress с помощью скрипта
17.01.2026
WooCommerce: как автоматически удалять отменённые и завершённые заказы по дате без плагинов
09.05.2026