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

В чем суть проблемы с неактивными заказами в WooCommerce

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

Ручное удаление таких заказов неудобно и требует времени. В статье рассмотрим, как настроить автоматическое удаление заказов, которые находятся в статусе "неактивен" (например, "pending", "failed" или "on-hold") дольше определенного периода.

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

  • Перейдите в WooCommerce → Заказы и отфильтруйте по статусам "Ожидает оплаты" (pending), "В ожидании" (on-hold), "Неудачный" (failed).
  • Проверьте, сколько заказов находится в этих статусах дольше 7-14 дней.
  • Если таких заказов много (сотни и более), стоит настроить автоматическое удаление.

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

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

Этот запрос покажет заказы в указанных статусах старше 14 дней.

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

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

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

function wphelper_delete_old_inactive_orders() {
    // Задаем статус заказов, которые считаем неактивными
    $statuses = array('pending', 'on-hold', 'failed');
    // Минимальный возраст заказа в днях
    $days = 14;
    
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ($statuses as $status) {
        $args = array(
            'status' => $status,
            'date_created' => '<' . $date,
            'limit' => -1, // без лимита
            'return' => 'ids',
        );
        $orders = wc_get_orders($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // жесткое удаление
            }
        }
    }
}

2. Запускаем функцию по расписанию с помощью WP-Cron

Добавим событие в WP-Cron для автоматического запуска удаления раз в сутки.

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

add_action('wphelper_daily_delete_inactive_orders', 'wphelper_delete_old_inactive_orders');

3. Очистка cron-события при деактивации

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

function wphelper_deactivate() {
    $timestamp = wp_next_scheduled('wphelper_daily_delete_inactive_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wphelper_daily_delete_inactive_orders');
    }
}
register_deactivation_hook(__FILE__, 'wphelper_deactivate');

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

  • Подождите 24 часа или запустите функцию вручную, вызвав wphelper_delete_old_inactive_orders() через консоль WP-CLI или временно добавив вызов в код.
  • Проверьте в админке WooCommerce → Заказы, что старые неактивные заказы удалились.
  • Запрос в базе данных (тот же, что в разделе диагностики) должен вернуть 0 записей.
  • Обратите внимание, что удаление происходит только для заказов старше 14 дней и в указанных статусах.

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

  • Заказы не удаляются: Проверьте, что функция wphelper_delete_old_inactive_orders() действительно вызывается. Добавьте логирование или временно вызовите функцию вручную.
  • Удаляются не те заказы: Убедитесь, что в массиве $statuses указаны правильные статусы с префиксом без wc- (wc_get_orders принимает статусы без префикса).
  • Проблемы с производительностью при большом количестве заказов: Добавьте лимит и запуск по частям, например, обработка 50 заказов за раз.
  • Заказы не удаляются окончательно: Используйте wp_delete_post($order_id, true); с параметром true для жесткого удаления, иначе заказы попадут в корзину.

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

  • Перед удалением сделайте резервную копию базы данных, особенно если у вас большой магазин.
  • Не уменьшайте период удаления меньше 7 дней — клиенты могут оплачивать заказы с задержкой.
  • Для больших магазинов с сотнями тысяч заказов используйте пакетную обработку с ограничением количества удаляемых заказов за раз.
  • Если WP-Cron работает нестабильно, настройте системный cron для запуска wp-cron.php вместо стандартного механизма WordPress.
  • Для дополнительного контроля можно отправлять email-уведомления администратору после удаления заказов, добавив в функцию вызов wp_mail.

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, без кодаТрудоемко, риск пропуска заказов
SQL-запросы напрямуюБыстрое массовое удалениеРиск повредить данные, сложность для новичков
Автоматизация через WP-Cron + PHPАвтоматизация, гибкость, безопасно при правильной реализацииТребует базовых знаний кода, может потребовать настройки cron
Как отключить системные чтения WooCommerce для повышения производительности
06.05.2026
Как создать настройку темы в WordPress
07.11.2025
Как разрешить доступ к файлам в WordPress без плагинов
05.02.2026
Как использовать WP-Cron для автоматического обновления данных в WordPress
07.01.2026
WooCommerce: правильная настройка атрибутов и вариантов товаров без ошибок
24.06.2026