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

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

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

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

1. Использование WP-Cron для планирования задачи

В WordPress есть встроенный механизм планировщика задач — WP-Cron. Мы создадим функцию, которая будет запускаться раз в сутки и удалять заказанные с статусом cancelled старше 7 дней.

2. Код для автоматического удаления заказов

function wptricks_delete_cancelled_orders() {
    $days = 7; // число дней задержки
    $date = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));

    // Запрос заказов со статусом cancelled старше $days
    $args = array(
        'status' => 'cancelled',
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // помещаем заказ в корзину
            // для полного удаления можно использовать wp_delete_post($order_id, true);
        }
    }
}

// Регистрируем событие, если оно ещё не запущено
if (!wp_next_scheduled('wptricks_daily_delete_cancelled_orders')) {
    wp_schedule_event(time(), 'daily', 'wptricks_daily_delete_cancelled_orders');
}

add_action('wptricks_daily_delete_cancelled_orders', 'wptricks_delete_cancelled_orders');

3. Как вручную запустить задачу для теста

Добавьте в функции временный вызов:

// Для теста
wptricks_delete_cancelled_orders();

Не забудьте удалить этот вызов после проверки, чтобы избежать двойных запусков.

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

  • Зайдите в WooCommerce - Заказы и отфильтруйте по статусу «Отменён». Заказы, которым больше 7 дней, должны исчезнуть после запуска задачи.
  • Для проверки можно вручную изменить дату создания тестового заказа на более раннюю через базу данных или плагины для редактирования заказов.
  • Проверьте wp_cron, например, с помощью плагина WP Crontrol, что задача wptricks_daily_delete_cancelled_orders запланирована и выполняется.

Частые ошибки и способы их исправления

  • Задача не запускается — WP-Cron зависит от посещений сайта. Для гарантированной работы настройте системный cron на сервере или используйте плагин WP Crontrol для отладки.
  • Заказы не удаляются — проверьте, что у вас есть права на удаление заказов. Если используете wp_trash_post, заказы попадают в корзину, но не удаляются физически. Для полного удаления применяйте wp_delete_post($order_id, true).
  • Некорректное определение даты — проверьте формат даты и часовой пояс сайта в настройках WordPress, чтобы правильно считать 7 дней.
  • Проблемы с производительностью — при большом количестве заказов ограничьте число удаляемых заказов за один запуск, добавив параметр 'limit' => 50 и реализовав пагинацию.

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

  • Сохраняйте резервные копии базы данных перед внедрением автоматического удаления заказов.
  • Не удаляйте заказы мгновенно — всегда используйте задержку, чтобы избежать потери важных данных.
  • Добавьте логирование удалённых заказов, например, через error_log или отдельный файл, чтобы иметь историю действий.
  • Для сайтов с большим потоком заказов подумайте о реализации пакетной обработки с ограничением количества заказов для удаления за один запуск.
  • Если вы используете плагин Clearfy Pro от WPShop, можно дополнительно очистить базу от мусорных данных и оптимизировать таблицы.

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

МетодПлюсыМинусыПример кода
WP-Cron + wp_trash_postБезопасно, заказы можно восстановить из корзиныЗаказы не удаляются физически, занимает местоВ статье выше
WP-Cron + wp_delete_post(true)Полное удаление, экономия местаНельзя восстановить после удаленияwp_delete_post($order_id, true);
Ручное удаление через админкуКонтроль действийНе автоматизировано, трудозатратноНет кода
Как удалить неиспользуемые типы записей в базе данных WordPress
07.01.2026
Как изменить автоматические сообщения WordPress
10.04.2026
Как создать запросы в WordPress на основе мета данных
22.02.2026
WooCommerce: автоматическое возврат средств и смена статуса заказа через код
29.06.2026
Как создать автоматический импорт продуктов WooCommerce из Excel
14.03.2026