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

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

В WooCommerce нередко возникают заказы, которые остаются в статусах «заблокирован» (например, custom status) или «задержан» (pending, on-hold) слишком долго. Это приводит к раздутой базе данных, замедлению работы админки и неудобству при управлении продажами. Для масштабных магазинов с сотнями заказов ручное удаление неэффективно, необходима автоматизация.

Проверьте, есть ли такие заказы, выполнив SQL-запрос в базе или через WP-CLI:

wp wc order list --status=on-hold,pending --format=ids

Если список длинный, пора автоматизировать удаление.

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

1. Определяем критерии удаления

Удаляем заказы со статусами on-hold, pending и пользовательские «заблокированные», если они старше, например, 30 дней. Это поможет очистить базу без потери актуальных заказов.

2. Создаем функцию удаления заказов по статусу и дате

function clear_old_woocommerce_orders() {
    $statuses_to_clear = array('on-hold', 'pending', 'blocked'); // 'blocked' — пример кастомного статуса
    $days_limit = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_limit} days"));

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

    $orders = wc_get_orders($args);
    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            $order->delete(true); // true — удаление навсегда
        }
    }
}

3. Запускаем функцию по расписанию

Лучше всего запускать очистку раз в неделю через WP-Cron:

add_action('clear_old_orders_event', 'clear_old_woocommerce_orders');

if (!wp_next_scheduled('clear_old_orders_event')) {
    wp_schedule_event(time(), 'weekly', 'clear_old_orders_event');
}

4. Очистка кастомных метаданных (если нужно)

Если у заказов есть нестандартные метаданные, которые занимают место, можно дополнительно чистить их через:

global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->postmeta} WHERE post_id IN (" . implode(',', $orders) . ") AND meta_key LIKE '_custom_meta_%'");

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

1. Запустите функцию вручную для теста:

clear_old_woocommerce_orders();

2. Проверьте количество заказов в статусах on-hold, pending и blocked старше 30 дней через админку или SQL:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' 
AND post_status IN ('wc-on-hold', 'wc-pending', 'wc-blocked') 
AND post_date < NOW() - INTERVAL 30 DAY;

3. Убедитесь, что количество заказов уменьшилось после выполнения функции.

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

  • Ошибка: Неправильное имя статуса заказа. WooCommerce использует префикс wc- для статусов в базе, например, wc-on-hold. В wc_get_orders указывайте статусы без префикса (on-hold), но при прямом SQL-запросе учитывайте префикс.
  • Ошибка: Функция не запускается по расписанию. Проверьте, активирован ли WP-Cron и нет ли конфликтов с плагинами, отключающими Cron.
  • Ошибка: Заказы не удаляются полностью. Метод $order->delete(true) удаляет заказ из базы. Если оставить false, заказ уйдет в корзину удалений, но не удалится.
  • Ошибка: Отсутствие резервного копирования перед удалением. Обязательно создавайте резервные копии базы, чтобы восстановить данные в случае ошибки.

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

  • Всегда тестируйте код на staging-среде, чтобы избежать потери данных.
  • Оптимизируйте запросы, не запрашивайте слишком много заказов одним махом — при больших магазинах добавьте пагинацию.
  • Планируйте удаление в ночное время или периоды низкой нагрузки.
  • Резервное копирование базы — обязательное условие перед внедрением автоматизации.
  • Если у вас кастомные статусы, добавьте их в массив $statuses_to_clear.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаВремя, не подходит для большого объема заказов
WP-CLIБыстро, можно автоматизироватьТребует доступа к серверу, навыков CLI
Код на PHP с WP-Cron (описанный способ)Полная автоматизация, гибкостьНужно тестировать, требует контроля
Автоматическое удаление отключённых и неоплаченных заказов в WooCommerce
17.05.2026
Как защитить WordPress от zero-day уязвимостей и что делать после обнаружения
28.01.2026
Автоматическое удаление неоплаченных заказов в WooCommerce по срокам
07.05.2026
Как настроить отправку писем WordPress через SMTP: плагины и примеры кода
21.02.2026
Автоматическое удаление отложенных заказов в WooCommerce: практические методы и примеры кода
04.05.2026