Автоматическое удаление заблокированных и замедленных заказов WooCommerce

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

В интернет-магазинах на WooCommerce часто накапливаются заказы в статусах, которые не меняются долгое время: заблокированные, отложенные, ожидающие оплаты. Это создает нагрузку на базу данных, замедляет отчеты и усложняет управление заказами. Чтобы решить проблему, нужно автоматизировать удаление таких заказов по определенным критериям.

Как понять, что проблема есть?

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

Для диагностики выполните SQL-запрос, чтобы проверить количество заказов с длительным временем без активности:

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

Если число велико, пора автоматизировать очистку.

Пошаговое решение: удаление заказов через PHP-код

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

Например, удалять заказы со статусом on-hold и failed, которые старше 30 дней.

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

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

function wc_auto_delete_old_orders() {
    $statuses_to_delete = array('on-hold', 'failed');
    $days_old = 30;

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array_map(function($status) { return 'wc-' . $status; }, $statuses_to_delete),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => "$days_old days ago",
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true);
        }
    }
}

// Запускаем очистку раз в сутки
if (!wp_next_scheduled('wc_daily_order_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wc_daily_order_cleanup');
}
add_action('wc_daily_order_cleanup', 'wc_auto_delete_old_orders');

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

Для проверки работоспособности добавьте временно вызов функции в functions.php и обновите любую страницу:

wc_auto_delete_old_orders();

После проверки удалите этот вызов, чтобы не запускать функцию при каждом запросе.

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

  • В панели WooCommerce проверьте количество заказов с удалёнными статусами — они должны исчезнуть.
  • Сделайте SQL-запрос из раздела диагностики — количество старых заказов должно уменьшиться.
  • Для контроля журналов можно добавить логирование в функцию удаления:
function wc_auto_delete_old_orders() {
    $statuses_to_delete = array('on-hold', 'failed');
    $days_old = 30;
    $deleted_count = 0;

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array_map(function($status) { return 'wc-' . $status; }, $statuses_to_delete),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => "$days_old days ago",
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            if(wp_delete_post($order_id, true)) {
                $deleted_count++;
            }
        }
    }
    error_log("WooCommerce: удалено заказов - $deleted_count");
}

Частые ошибки и способы их устранения

  • Заказы не удаляются: Проверьте, что статусы указаны корректно с префиксом wc-. В WooCommerce статусы заказов хранятся с этим префиксом.
  • Функция запускается слишком часто: Используйте wp_schedule_event для разового запуска в сутки, чтобы избежать нагрузки на сервер.
  • Удаление не происходит из-за прав: Убедитесь, что у пользователя, под которым работает сайт (PHP процесс), есть права на удаление постов, и что нет плагинов, блокирующих удаление.
  • Проблемы с кешированием: После удаления сделайте очистку кеша (если используется кеш), чтобы изменения отобразились.

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

  • Обязательно используйте wp_delete_post($order_id, true) для полного удаления с метаданными.
  • Перед запуском на продакшене рекомендуем делать резервную копию базы данных.
  • Если в магазине много заказов, используйте posts_per_page с разумным лимитом и пагинацию по пакетам, чтобы избежать таймаута.
  • Добавьте проверку nonce и прав пользователя, если функция вызывается через HTTP запрос или AJAX.
  • Для более гибкой настройки используйте фильтры и параметры через админку или константы.

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

МетодПреимуществаНедостаткиРекомендуемые случаи
Плагин (например, WP Reset или специализированные очистители)Простота установки, готовые функции, интерфейсМожет быть избыточным, нагрузка на сайтДля администраторов без навыков разработки
Код с wp_schedule_eventГибкие настройки, автоматизация, контрольТребует навыков разработки, требует тестированияДля разработчиков и сайтов с кастомными требованиями
Ручное удаление через SQLБыстро, без загрузки PHPРиск ошибок, нет автоматизации, сложность поддержкиДля опытных администраторов при разовых задачах
Автоматическое удаление отключённых и неоплаченных заказов WooCommerce с помощью кода
23.05.2026
Отслеживание последних изменений в WordPress для безопасности сайта
31.01.2026
Автоматическое удаление неоплаченных заказов в WooCommerce
14.05.2026
Как настроить отправку писем WordPress через SMTP: плагины и примеры кода
21.02.2026
Как отключить плагины на определённых страницах WordPress
06.02.2026