Как автоматически удалять отказанные заказы в 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
12.03.2026
Как защитить WordPress от приватных регистраций с помощью капчи и плагинов
12.02.2026
Как защитить WordPress от атак с помощью Content Security Policy
20.12.2025
Как установить лимит на запросы REST API WordPress для защиты сайта
21.03.2026
Как автоматизировать удаление старого контента в WordPress
22.01.2026