Как удалить зависшие заказы в WooCommerce через функции и базу данных

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

Зависшие заказы — это заказы, которые по каким-либо причинам не перешли в статус «завершён» или «отменён» и долго находятся в статусах «обработка», «ожидает оплаты» или «в ожидании». Это создает нагрузку на базу данных и мешает корректной работе магазина, а также может исказить статистику продаж.

Для диагностики используйте SQL-запрос к базе данных WordPress:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-processing', 'wc-on-hold') ORDER BY post_date ASC;

Этот запрос покажет все заказы в статусах, которые чаще всего «зависают». Если количество таких заказов велико (сотни и более), необходимо их чистить.

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

1. Создание функции очистки заказов

Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомного кода:

function wplancer_delete_stale_orders() {
    $days_threshold = 7; // Количество дней, после которых заказ считается зависшим
    $statuses_to_delete = array('wc-pending', 'wc-on-hold', 'wc-processing');

    $args = array(
        'limit' => -1,
        'status' => $statuses_to_delete,
        'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days_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) {
            // Безопасное удаление заказа
            wp_delete_post($order_id, true);
        }
    }
}

2. Автоматизация запуска через WP-Cron

Чтобы функция запускалась автоматически (например, раз в сутки), добавьте в functions.php:

if (!wp_next_scheduled('wplancer_daily_cleanup_orders')) {
    wp_schedule_event(time(), 'daily', 'wplancer_daily_cleanup_orders');
}
add_action('wplancer_daily_cleanup_orders', 'wplancer_delete_stale_orders');

3. Ручной запуск для проверки

Для тестирования можно вызвать функцию напрямую в админке или через WP-CLI:

wp eval 'wplancer_delete_stale_orders();'

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

Для проверки:

  • Запустите SQL-запрос из раздела диагностики до и после удаления — количество зависших заказов должно уменьшиться.
  • Проверьте логи ошибок и убедитесь, что нет ошибок при удалении.
  • Просмотрите список заказов в админке WooCommerce, чтобы убедиться, что зависшие заказы пропали.

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

  • Ошибка: Заказы не удаляются.
    Причина: неправильные статусы в массиве $statuses_to_delete или используется устаревшая версия WooCommerce.
    Решение: Проверьте актуальные статусы через wc_get_order_statuses() и обновите WooCommerce.
  • Ошибка: Удаляются нужные заказы.
    Причина: слишком большой порог по времени или неправильно выбран статус.
    Решение: Уменьшите $days_threshold или уточните статусы для удаления.
  • Ошибка: WP-Cron не срабатывает.
    Причина: на хостинге отключён WP-Cron или мало трафика.
    Решение: настройте системный cron для запуска wp-cron.php.

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

  • Удаляйте заказы только после тщательной проверки, чтобы не потерять нужные данные.
  • Всегда делайте резервную копию базы перед автоматической очисткой.
  • Для сайтов с большим количеством заказов разбивайте удаление на партии, чтобы не перегружать сервер.
  • Используйте фильтры WooCommerce, например 'woocommerce_delete_order', чтобы расширять логику удаления.
  • Отключайте автоматический запуск при отладке, чтобы избежать случайных удалений.

Сравнение вариантов удаления зависших заказов

МетодПлюсыМинусы
Ручное удаление через админкуПростота, контрольТрудоемко, не подходит для большого количества
SQL-запросы напрямуюБыстро, без нагрузки на PHPРиск повреждения данных, требует навыков
Функция + WP-Cron (код)Автоматизация, безопасность (через WP API)Нужно тестировать, зависит от WP-Cron
Как избежать повторов оплаты в WooCommerce: практическое руководство
28.05.2026
Автоматическое удаление зависших вариантов товаров в WooCommerce
06.07.2026
Как создать свой шорткод в WordPress: подробное руководство
08.11.2025
Как автоматически очистить кеш и оптимизировать WooCommerce после обновления
18.06.2026
Создание динамических ролей пользователей в WordPress
11.04.2026