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

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

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

Типичные симптомы проблемы:

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

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

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

Для начала решите, через сколько времени после создания неоплаченный заказ должен быть удален. Например, 3 суток (72 часа) — стандартный срок, который можно адаптировать под свои нужды.

2. Добавляем WP-Cron задачу

Чтобы регулярно проверять и удалять старые неоплаченные заказы, используем запланированное событие WordPress (WP-Cron). Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код:

if ( ! wp_next_scheduled( 'wc_delete_old_unpaid_orders' ) ) {
    wp_schedule_event( time(), 'hourly', 'wc_delete_old_unpaid_orders' );
}

Этот код запускает событие wc_delete_old_unpaid_orders каждый час.

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

Теперь создадим функцию, которая будет искать неоплаченные заказы старше 3 дней и удалять их:

add_action( 'wc_delete_old_unpaid_orders', 'wc_delete_unpaid_orders_older_than' );

function wc_delete_unpaid_orders_older_than() {
    $days = 3; // количество дней до удаления
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array( 'wc-pending', 'wc-on-hold' ),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => 100,
    );

    $orders = get_posts( $args );

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

Обратите внимание, что удаление происходит без возможности восстановления (wp_delete_post с параметром true), чтобы не захламлять корзину.

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

  • Создайте тестовый заказ со статусом pending.
  • Измените значение $days на 0 или 0.001 (несколько минут), чтобы ускорить проверку.
  • Выполните вручную событие через wp-cli (если есть доступ): wp cron event run wc_delete_old_unpaid_orders.
  • Проверьте, что заказ удалился из базы данных и не отображается в админке.
  • Отслеживайте логи или добавьте запись в файл для отладки, если нужно.

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

  • Заказы не удаляются: проверьте, что событие WP-Cron действительно запускается. В средах с низким трафиком WP-Cron может не срабатывать. Решение — настроить системный cron на сервере для вызова wp-cron.php.
  • Удаляются лишние заказы: убедитесь, что фильтр статусов корректен и не включает оплаченные или обработанные заказы. Используйте только wc-pending и wc-on-hold.
  • Большая нагрузка при удалении: ограничьте количество удаляемых заказов за один запуск (например, posts_per_page = 100), чтобы не создавать нагрузку на сервер.

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

  • Не удаляйте заказы без резервного копирования базы данных. Настройте регулярные бэкапы.
  • Для больших магазинов с тысячами заказов используйте WP-CLI для пакетной очистки.
  • Добавьте логирование удалений для аудита и отладки.
  • Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpall.ru&utm_medium=article&utm_campaign=woocommerce-avto-udaleniye-neoplachennyh-zakazov-po-srokam-s-pomoshhyu-koda) для расширенной очистки и оптимизации базы WooCommerce без лишнего кода.

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

МетодПлюсыМинусы
Ручное удаление в админкеПросто, без кодаТрудозатратно, не автоматично
Автоматизация через WP-Cron и кодГибко, настраиваемо, бесплатноНужны базовые навыки PHP, возможны ошибки
Плагины для очистки WooCommerceУдобно, с поддержкой, расширенный функционалМогут быть платными, добавляют нагрузку
WooCommerce: автоматическое изменение цены продукта при добавлении в корзину
06.06.2026
Как создать собственный виджет в WordPress с примерами кода
14.11.2025
Как правильно использовать хуки (actions и filters) в WordPress с примерами кода
08.03.2026
Оптимизация AJAX-запросов в WordPress: практические решения и примеры кода
12.03.2026
WooCommerce: автоматическое удаление неоплаченных заказов по разным статусам и срокам
02.06.2026