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

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

Магазины на WooCommerce часто сталкиваются с накоплением заказов в статусах failed (отказанные) и on-hold (заблокированные). Это приводит к раздуванию базы данных, ухудшению производительности и усложнению управления заказами. Особенно актуально для магазинов с высокой конверсией и большим количеством транзакций.

Как понять, что у вас именно эта проблема? Проверьте количество заказов со статусами failed и on-hold через админку WooCommerce или напрямую в базе данных:

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-on-hold');

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

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

1. Создание функции для удаления заказов по статусу и возрасту

Реализуем функцию, которая удаляет заказы со статусом failed и on-hold, старше определенного количества дней (например, 30). Это гарантирует, что свежие заказы останутся для обработки.

function wpscan_delete_old_failed_on_hold_orders() {
    $statuses = array('wc-failed', 'wc-on-hold');
    $days = 30; // Количество дней, после которых заказы удаляются
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление
        }
    }
}

2. Автоматизация с помощью wp-cron

Чтобы функция запускалась регулярно, создадим cron-задачу, которая будет вызываться еженедельно.

// Регистрируем cron событие при активации темы или плагина
function wpscan_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpscan_weekly_order_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpscan_weekly_order_cleanup');
    }
}
add_action('wp', 'wpscan_schedule_order_cleanup');

// Обработчик cron события
add_action('wpscan_weekly_order_cleanup', 'wpscan_delete_old_failed_on_hold_orders');

// Очистка при деактивации темы или плагина
function wpscan_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpscan_weekly_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpscan_weekly_order_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpscan_clear_order_cleanup_schedule');

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

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

  • Запустите функцию вручную (через вызов wpscan_delete_old_failed_on_hold_orders() в консоли или временно добавьте вызов в шаблон) и проверьте количество заказов в базе.
  • Через wp-admin проверьте, что заказы со статусами failed и on-hold старше 30 дней исчезли.
  • Проверьте wp-cron: введите wp cron event list через WP-CLI, чтобы убедиться, что событие wpscan_weekly_order_cleanup запланировано.

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

  • Не удаляются заказы: Проверьте, что статусы указаны с префиксом wc- (например, wc-failed), иначе запрос не найдет нужные записи.
  • Функция вызывается, но заказы не удаляются: убедитесь, что у пользователя или процесса есть права на удаление заказов, и что wp_delete_post() вызывается с параметром true для полного удаления.
  • Крон не запускается: Проверьте, что на сервере настроена система запуска wp-cron или используйте системный cron для вызова wp-cron.php.
  • Удаление слишком частое или редкое: Настройте интервал запуска задачи, например, можно заменить 'weekly' на 'daily' или создать свой интервал через add_filter('cron_schedules').

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

  • Перед удалением заказов сделайте резервную копию базы данных.
  • Если заказов много, лучше разбивать удаление на партии (например, по 100 заказов за раз), чтобы избежать таймаута скрипта.
  • Ограничьте права доступа к функциям удаления, чтобы предотвратить случайный вызов посторонними.
  • Добавьте логирование удаленных заказов для аудита (можно использовать error_log или отдельный файл).

Сравнение вариантов решения

МетодПлюсыМинусыКомпромисс
Плагин (например, WP Sweep)Простота установки, готовый интерфейсМожет удалять лишнее, нагрузка на БДИспользовать для разовых чисток
Код в functions.php с wp-cronГибкость, контроль, автоматизацияТребует навыков, нужно тестироватьОптимально для постоянного решения
Ручное удаление через SQLБыстро, без нагрузки на WPРиск ошибок, нет автоматизацииИспользовать для разовых операций
Как защитить WordPress от несанкционированной загрузки файлов
09.02.2026
WooCommerce: решение проблемы неудачного удаления отключённых заказов
20.07.2026
Автоматическое удаление отложенных заказов в WooCommerce: практические методы и примеры кода
04.05.2026
Автоматическое удаление старых заказов WooCommerce по статусу: практическое руководство
20.05.2026
WooCommerce: как удалить заблокированные и замедленные заказы с помощью кода
18.06.2026