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

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

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

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

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

  • Перейдите в WooCommerce > Заказы
  • Отфильтруйте по статусу pending или failed
  • Обратите внимание на дату создания заказа

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

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

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

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

function wpfix_delete_unpaid_orders() {
    $days_to_keep = 7; // Количество дней, после которых заказы удаляются
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . $date_threshold,
        'limit' => -1
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        wp_delete_post($order->get_id(), true); // Удаляем полностью
    }
}

2. Регистрируем собственный CRON-хук

Добавляем ежечасное событие для вызова функции:

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

add_action('wpfix_delete_unpaid_orders_hook', 'wpfix_delete_unpaid_orders');

3. Очистка CRON при деактивации

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

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

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

  • Создайте тестовый заказ в статусе pending и измените дату создания на более чем 7 дней назад (через phpMyAdmin или плагин для редактирования заказов).
  • Запустите wp-cron вручную, например, перейдя по URL https://example.com/wp-cron.php?doing_wp_cron.
  • Проверьте, что заказ исчез из списка заказов.
  • Можно добавить логирование в функцию удаления для дополнительного контроля.

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

  • CRON не срабатывает: Убедитесь, что у вас включён WP-Cron и сайт регулярно посещается. Для надежности можно настроить системный cron на сервере.
  • Заказы не удаляются: Проверьте правильность статусов в запросе wc_get_orders. Статусы могут отличаться в зависимости от настроек.
  • Удаление не полное: Используйте wp_delete_post($order_id, true), чтобы удалить заказ без перемещения в корзину.
  • Проблемы с правами: Убедитесь, что скрипт запускается с достаточными правами для удаления постов.

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

  • Не устанавливайте слишком короткий срок хранения заказов, чтобы избежать удаления заказов, которые ещё могут быть оплачены.
  • Для крупных магазинов используйте пакетную обработку заказов по частям, чтобы не перегружать сервер.
  • Добавьте логирование действий удаления в отдельный лог-файл для аудита.
  • Ограничьте доступ к wp-cron.php, если используете системный cron, чтобы исключить внешние вызовы.

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

МетодПлюсыМинусыКогда использовать
Код с WP-Cron (как в статье)Гибко, не требует плагинов, можно настраиватьЗависит от работы WP-Cron, требует навыков разработкиСредние и большие магазины, кастомные решения
Плагины очистки заказов (например, Cancel Abandoned Order)Простота установки, готовые настройкиМогут быть платными, лишний плагинМалые магазины, если не хочется кодить
Ручное удаление из админкиБезопасно, без стороннего кодаТрудоёмко, не автоматичноМалое количество заказов, разовые чистки
Как использовать WPCommunity для создания внутреннего интранета на WordPress
12.04.2026
Как использовать хуки WordPress для отложенного выполнения кода
16.01.2026
WooCommerce: как запретить добавление дубликатов товаров в корзину
04.05.2026
Решение проблемы размытых изображений в WordPress
12.11.2025
Как установить ограничения на число постов в рубриках WordPress
26.01.2026