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

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

В WooCommerce отказанные заказы (статус failed) не удаляются автоматически, что со временем приводит к разрастанию базы данных и замедлению работы сайта. Многие пользователи замечают, что очистка вручную — неудобна и рискованна. Проблема особенно актуальна при большом потоке заказов, когда база быстро разрастается.

Чтобы убедиться в наличии проблемы, проверьте количество заказов со статусом failed в базе, например, через phpMyAdmin:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-failed';

Если число большое (сотни и тысячи), стоит автоматизировать удаление.

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

1. Добавление кода для удаления заказов по расписанию

Создаем хук на событие по расписанию, которое будет удалять заказы со статусом failed старше определенного времени (например, 7 дней).

function wc_cleanup_failed_orders() {
    $days = 7; // Возраст заказов для удаления
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // Можно заменить на wp_delete_post для безвозвратного удаления
    }
}

// Регистрация Cron задачи
add_action('wc_cleanup_failed_orders_hook', 'wc_cleanup_failed_orders');

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

// Очистка Cron при деактивации плагина или темы
function wc_unschedule_failed_orders_cleanup() {
    $timestamp = wp_next_scheduled('wc_cleanup_failed_orders_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_cleanup_failed_orders_hook');
    }
}
add_action('switch_theme', 'wc_unschedule_failed_orders_cleanup');

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

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

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

1. Проверьте наличие Cron задачи в админке через плагин WP Crontrol или аналогичный — должна появиться задача wc_cleanup_failed_orders_hook, выполняющаяся раз в сутки.

2. Создайте тестовый заказ с статусом failed и датой создания старше 7 дней (можно вручную изменить дату в базе).

3. Подождите выполнение Cron (можно запустить вручную через WP Crontrol).

4. Проверьте, что заказ был перемещен в корзину (если используется wp_trash_post) или удален (wp_delete_post).

5. Повторно выполните запрос в базе для подсчета отказанных заказов — их число должно уменьшиться.

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

  • Крон задачи не выполняются. Проверьте, что на сайте настроен WP-Cron и нет проблем с внешними вызовами. Для теста вызовите функцию вручную.
  • Заказы не удаляются. Убедитесь, что статус заказа указан правильно (wc-failed), и что wc_get_orders возвращает корректный список заказов.
  • Удаление приводит к ошибкам. Используйте wp_trash_post для перемещения в корзину, чтобы избежать потери данных. Если нужен полный удал, применяйте wp_delete_post с осторожностью.
  • Дата создания заказа не учитывается. Проверьте формат даты и правильность передачи параметра date_created в аргументы wc_get_orders. В WooCommerce 3.0+ используется объект даты, но строка в формате ISO 8601 тоже работает.

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

  • Не удаляйте заказы без резервного копирования базы данных.
  • Ограничьте удаление заказов только теми, которые старше минимального срока, чтобы не потерять актуальные данные.
  • При большом количестве заказов используйте пакетную обработку, чтобы не перегружать сервер:
    $batch_size = 50;
    $orders = wc_get_orders(array('status' => 'failed', 'date_created' => '<' . $date, 'limit' => $batch_size, 'return' => 'ids'));
    // Цикл удаления
  • Для контроля логов добавьте запись в отдельный лог-файл при выполнении удаления.

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

МетодПлюсыМинусыКомпромисс
Плагин очистки заказовПростота установки, интерфейсДополнительная нагрузка, возможны конфликтыИспользовать популярные и проверенные плагины
Ручное удаление через админкуКонтроль процессаТрудоемко, риск ошибокИспользовать для единичных случаев
Автоматическое удаление через код (Cron)Автоматизация, гибкость, минимальная нагрузкаТребует навыков разработкиНаиболее оптимально для опытных разработчиков
Как удалить старые версии постов в WordPress с помощью кода
27.12.2025
Как использовать WPScan для быстрого аудита безопасности WordPress
25.01.2026
Как автоматизировать удаление старых постов в WordPress по дате
27.03.2026
Как автоматизировать удаление неиспользуемых плагинов WordPress
27.02.2026
Автоматическое удаление отключённых и неоплаченных заказов WooCommerce с помощью кода
23.05.2026