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

Почему важно удалять неактуальные неоплаченные заказы

В WooCommerce при оформлении заказа создается запись в базе данных, даже если покупатель не завершил оплату. Такие неоплаченные заказы накапливаются, загромождая базу данных и замусоривая админку. Особенно это критично для магазинов с большим трафиком и количеством заказов. Автоматическое удаление устаревших неоплаченных заказов помогает держать базу «чистой» и улучшает производительность.

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

Для начала проверьте количество неоплаченных заказов и их возраст:

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';

Если таких заказов сотни или тысячи, и они старше нескольких дней, стоит настроить автоматическое удаление.

Проверка статусов заказов

Убедитесь, что заказы с другими статусами (например, wc-processing, wc-completed) не затрагиваются.

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

Рекомендуется удалять заказы, которые не оплачивались более 7 дней. Этот срок можно настроить под нужды магазина.

Реализация автоматического удаления через cron и PHP-код

WooCommerce не имеет встроенного механизма автоматического удаления заказов, поэтому добавим свой код в файл functions.php вашей темы (или в отдельный плагин):

function wc_delete_old_unpaid_orders() {
    $days = 7; // удаляем заказы старше 7 дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'limit' => -1,
        'status' => 'pending',
        'date_created' => '<' . $date,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

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

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

// Регистрируем WP-Cron событие
if ( ! wp_next_scheduled( 'wc_delete_old_unpaid_orders_event' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_delete_old_unpaid_orders_event' );
}

add_action( 'wc_delete_old_unpaid_orders_event', 'wc_delete_old_unpaid_orders' );

Код выполняет следующие действия:

  • Определяет дату 7 дней назад.
  • Получает все заказы со статусом wc-pending, созданные до этой даты.
  • Удаляет каждый заказ полностью из базы.
  • Запускает функцию ежедневно через WP-Cron.

Как проверить, что автоматическое удаление работает

  1. Создайте тестовый заказ с статусом «Ожидает оплаты» и датой, старше 7 дней (можно изменить дату вручную в базе).
  2. Выполните вручную функцию через или дождитесь ежедневного запуска WP-Cron (установите WP Crontrol для управления задачами).
  3. Проверьте, что заказ исчез из админки WooCommerce и таблицы wp_posts.
  4. Мониторьте логи ошибок и убедитесь, что нет сбоев.

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

  • Крон-задача не запускается: WP-Cron зависит от посещаемости сайта. Для надежности настройте системный cron на сервере или используйте плагин WP Crontrol для ручного запуска.
  • Функция не удаляет заказы: проверьте правильность статуса. WooCommerce использует статус с префиксом wc-, например, wc-pending. В wc_get_orders нужно указывать статус без префикса pending или с префиксом wc-pending в зависимости от версии WooCommerce.
  • Удаляются нужные заказы: будьте внимательны с условием даты и статуса. Лучше сначала вывести список ID заказов, которые будут удалены, а затем запускать удаление.
  • Проблемы с правами доступа: убедитесь, что пользователь, под которым работает PHP, имеет права на удаление записей.

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

  • Перед удалением заказы можно экспортировать для резервного копирования.
  • Удаление большого количества заказов за один раз может нагружать сервер — добавьте лимит и запускайте удаление партиями.
  • Если на сайте много заказов, используйте WP-CLI для массовых операций.
  • Для надежности отслеживайте логи выполнения cron-задачи.

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

МетодПреимуществаНедостатки
Плагин (например, WooCommerce Order Cleaner)Простая настройка, готовый функционалДополнительная нагрузка, может не работать с кастомными статусами
Код и WP-Cron (как описано выше)Гибкость, контроль, отсутствие лишних плагиновНужны базовые знания PHP, нужно следить за cron
Ручное удаление через админкуБезопасно, ничего не ломаетТрудозатратно, не автоматизировано
WooCommerce: как автоматически удалять неоплаченные заказы через cron и код
26.05.2026
Как создать автоматическую ответную форму в WordPress
06.01.2026
Добавление пользовательских полей в WP REST API для пользователей WordPress
19.03.2026
Автоматическое удаление неиспользуемых плагинов в WordPress: практическое руководство
15.02.2026
Как создать автоматический кэш в WordPress с использованием Redis
07.02.2026