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

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

В WooCommerce иногда возникают ситуации, когда заказы остаются в статусе, который не меняется долгое время — например, «заблокированные» (failed, on-hold) или «замедленные» (pending, processing), что мешает корректному учёту и влияет на производительность базы данных. Частая причина — ошибки оплаты, сбои при обновлении статуса или некорректные плагины.

Чтобы выявить такие заказы, можно выполнить запрос к базе данных или использовать WP_Query с фильтром по статусу.

Пример запроса для поиска заблокированных заказов:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-on-hold') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Этот запрос покажет заказы со статусом «failed» и «on-hold», созданные более 30 дней назад.

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

Чтобы автоматизировать очистку, создадим функцию, которую можно запускать вручную или через cron. Она будет искать заказы в определённых статусах старыми более 30 дней и удалять их.

Код для удаления старых заблокированных заказов:

function wpscan_delete_stale_blocked_orders() {
    $statuses_to_delete = array('wc-failed', 'wc-on-hold');
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

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

    $orders = get_posts($args);

    if (empty($orders)) {
        error_log('No stale blocked orders found.');
        return;
    }

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // можно заменить на wp_delete_post($order_id, true) для полного удаления
        error_log('Deleted stale blocked order ID: ' . $order_id);
    }
}

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

if (!wp_next_scheduled('wpscan_delete_stale_orders_cron')) {
    wp_schedule_event(time(), 'daily', 'wpscan_delete_stale_orders_cron');
}

add_action('wpscan_delete_stale_orders_cron', 'wpscan_delete_stale_blocked_orders');

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

1. Проверьте журнал ошибок (error_log) для сообщений о выполнении удаления.
2. В админке WooCommerce в списке заказов убедитесь, что заказы со статусами failed и on-hold старше 30 дней отсутствуют.
3. Для дополнительной проверки выполните SQL-запрос из раздела диагностики до и после запуска скрипта.

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

  • Ошибка удаления заказов: функция wp_trash_post не удаляет, а помещает заказ в корзину. Используйте wp_delete_post($order_id, true) для полного удаления.
  • Проблемы с cron-задачей: если WP-Cron не срабатывает, проверьте, не отключён ли он в wp-config.php (DISABLE_WP_CRON). Для надёжности настройте системный cron для вызова wp-cron.php.
  • Удаляются не те заказы: убедитесь, что в массиве $statuses_to_delete указаны правильные статусы с префиксом wc-.
  • Проблемы с производительностью: при большом количестве заказов используйте постраничный вывод (пагинацию) в запросе, чтобы не перегружать память.

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

  • Перед удалением всегда делайте резервную копию базы данных.
  • Для больших магазинов запускайте удаление в off-peak часы, чтобы не влиять на работу сайта.
  • Используйте wp_trash_post вместо полного удаления, если хотите иметь возможность восстановить заказ.
  • Логируйте действия удаления для аудита.
  • Оптимизируйте базу данных после массовых удалений с помощью плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpscan.ru&utm_medium=article&utm_campaign=woocommerce-udalit-zablokirovannye-i-zamedlennye-zakazy) — это поможет очистить мусор и повысить скорость.

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

МетодПреимуществаНедостаткиРекомендации
wp_trash_post()Позволяет восстановить заказ из корзиныЗаказы остаются в базе, занимают местоИспользовать при нерешительности с окончательным удалением
wp_delete_post($id, true)Полное удаление из базы данныхНельзя восстановить без резервной копииИспользовать для чистки старых заказов
Удаление через SQLСамый быстрый способРиск повредить целостность данных, требует аккуратностиИспользовать только при полном понимании структуры данных
Как установить и настроить WordPress Web Application Firewall (WAF) для защиты сайта
11.01.2026
Как удалить неиспользуемые метаданные товаров WooCommerce с помощью кода
26.05.2026
Как отключить плагины на определённых страницах WordPress
06.02.2026
Как автоматизировать удаление старых постов в WordPress по дате
27.03.2026
Защита WordPress от атак через XML-RPC
17.12.2025