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

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

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

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

Для начала необходимо понять, какие именно заказы считать «неоплаченными» и сколько времени им можно давать на оплату. Обычно это заказы в статусах pending или on-hold, которые не менялись в течение 24-72 часов.

  • Откройте базу данных и найдите таблицу wp_posts с типом shop_order.
  • Отфильтруйте заказы по статусу post_status (например, wc-pending).
  • Проверьте столбец post_date или мета-ключи для даты последнего обновления.

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

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < NOW() - INTERVAL 48 HOUR;

Пошаговое решение: автоматизация удаления заказов

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

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

function wc_delete_old_unpaid_orders() {
    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'on-hold'),
        'date_created' => '<' . ( new WC_DateTime( '-48 hours' ) )->format( 'Y-m-d H:i:s' ),
        'return'       => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            $order->delete( true ); // true - принудительное удаление
        }
    }
}

2. Настройка регулярного запуска через WP-Cron

Чтобы функция выполнялась автоматически, добавим событие в планировщик WordPress:

function wc_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wc_delete_old_unpaid_orders_event' ) ) {
        wp_schedule_event( time(), 'hourly', 'wc_delete_old_unpaid_orders_event' );
    }
}
add_action( 'wp', 'wc_schedule_order_cleanup' );

add_action( 'wc_delete_old_unpaid_orders_event', 'wc_delete_old_unpaid_orders' );

Этот код запустит очистку раз в час, удаляя заказы старше 48 часов в статусах pending и on-hold.

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

  • Создайте тестовый заказ в статусе pending и выставьте дату создания более 48 часов назад (можно вручную в базе данных).
  • Запустите функцию вручную, вызвав wc_delete_old_unpaid_orders() через консоль или временно добавив add_action('init', 'wc_delete_old_unpaid_orders');.
  • Проверьте, что заказ удалился из админки WooCommerce и из базы данных (wp_posts).
  • Убедитесь, что WP-Cron запускается, для этого посмотрите в логи или используйте плагин WP Crontrol.

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

  • Заказы не удаляются: проверьте права пользователя, под которым выполняется скрипт;
  • WP-Cron не срабатывает: убедитесь, что на сервере посещают сайт, или настройте системный cron для запуска wp-cron.php;
  • Удаляются нужные заказы: внимательно проверьте фильтр date_created и статусы заказов в аргументах;
  • Ошибка памяти или таймаута: если заказов много, реализуйте пакетное удаление, например, по 50 заказов за раз.

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

  • Не удаляйте заказы сразу после создания, дайте клиенту время оплатить;
  • Добавьте логирование удаления заказов для аудита;
  • Для больших магазинов используйте пакетную обработку с wp_schedule_single_event для очередей;
  • Используйте WP CLI для ручного запуска и отладки;
    wp eval 'wc_delete_old_unpaid_orders();'
  • Проверяйте, что резервное копирование базы данных работает корректно перед автоматическим удалением.

Сравнение вариантов реализации

МетодПреимуществаНедостатки
Код в functions.php с WP-CronБыстрая интеграция, гибкостьЗависит от посещаемости сайта, может быть нестабилен на слабых хостингах
Внешний системный cron с WP CLIНадежность и точное время выполненияТребуется доступ к серверу и дополнительная настройка
Плагины автоматизации (например, WP Crontrol)Удобный интерфейс, мониторинг событийДобавляет нагрузку, не всегда подходит для сложных условий
Как добавить собственную таблицу в базу данных WordPress с примером кода
01.12.2025
WordPress: как создать страницу настроек в плагине с использованием Settings API
26.12.2025
Как добавить автоматический режим работы плагинов WordPress
28.01.2026
Как использовать вебхуки в WordPress для автоматизации задач
02.03.2026
WooCommerce: как автоматически удалять товары из корзины после успешной оплаты
06.06.2026