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

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

В WooCommerce неоплаченные заказы (статусы pending и failed) накапливаются в базе, занимая место и усложняя управление заказами. Особенно это актуально для магазинов с большим трафиком и большим количеством брошенных корзин. Ручное удаление заказов неудобно и часто забывается.

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

  • В разделе Заказы WooCommerce множество заказов в статусе pending старше нескольких дней.
  • Замедление работы админки из-за объема заказов.
  • Проблемы с отчетностью и аналитикой из-за «мусорных» заказов.

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

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

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

function wpkey_delete_old_unpaid_orders() {
    // Время в часах, после которого заказ считается устаревшим
    $hours = 24; 
    $date = date('Y-m-d H:i:s', strtotime('-' . $hours . ' hours'));

    // Получаем заказы в статусах 'pending' и 'failed', созданные до указанного времени
    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Перемещаем заказ в корзину
        }
    }
}

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

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

add_action('wpkey_daily_cleanup', 'wpkey_delete_old_unpaid_orders');

function wpkey_setup_schedule() {
    if (!wp_next_scheduled('wpkey_daily_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpkey_daily_cleanup');
    }
}
add_action('wp', 'wpkey_setup_schedule');

3. Очистка расписания при деактивации плагина

Если код будет в плагине, нужно очищать крон-задачу при деактивации:

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

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

Чтобы убедиться, что удаление работает:

  1. Создайте тестовый заказ в статусе pending или failed с датой создания более 24 часов назад (можно вручную через базу или изменить дату заказа программно).
  2. Запустите функцию вручную в админке, вызвав wpkey_delete_old_unpaid_orders() через консоль WP-CLI или временно добавив вызов в functions.php.
  3. Проверьте, что заказ перемещён в корзину (Trash) в разделе Заказы.
  4. Убедитесь, что при наступлении времени cron-задачи она выполняется (можно использовать плагин WP Crontrol для проверки и запуска cron-событий).

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

  • Заказы не удаляются — проверьте, что cron-задание правильно зарегистрировано и запускается. Используйте WP Crontrol для диагностики.
  • Функция ничего не находит — убедитесь, что передаете правильный формат даты в wc_get_orders. Используйте формат Y-m-d H:i:s и проверяйте временную зону сайта.
  • Удаляются нужные заказы — уточните фильтр по статусам, не включайте статусы processing и completed. Проверьте логику фильтрации даты.
  • Высокая нагрузка при удалении — если заказов очень много, используйте разбивку по партиям (batch processing), например, удалять по 50 заказов за раз.

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

  • Не используйте wp_delete_post() без необходимости — лучше перемещать заказы в корзину (wp_trash_post()) для возможности восстановления.
  • Ограничьте количество удаляемых заказов за один запуск, чтобы избежать таймаутов и повышенной нагрузки на сервер.
  • Регулярно проверяйте логи ошибок PHP и WooCommerce для своевременного обнаружения проблем.
  • Для крупных магазинов стоит рассмотреть внешние cron-задачи (например, через системный cron), так как WP-Cron срабатывает при загрузке сайта и может быть ненадежным.
  • Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpkey.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-neoplachennyh-zakazov-po-tajmoutu) для оптимизации базы данных и дополнительного контроля за заказами.

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

МетодПлюсыМинусыРекомендации
Ручное удалениеПростота, контрольТрудозатратно, риск забытьПодходит для небольших магазинов
Плагин удаления заказовАвтоматизация, настройкаЗависимость от стороннего кода, возможные конфликтыХорошо для большинства пользователей
Кастомный код с WP-CronТочный контроль, легковесностьНужны навыки разработки, риски при неправильном кодеОптимально для разработчиков и крупных проектов
Как автоматически отключать неиспользуемые плагины в WordPress
29.03.2026
Как автоматизировать удаление старых комментариев в WordPress
09.04.2026
WooCommerce: автоматизация отмены и возврата заказов
23.04.2026
Как запустить WordPress без PHP: практическое руководство по Headless CMS
21.03.2026
Как установить и настроить Redis для кэширования в WordPress
14.11.2025

Ресурс в разработке, скоро здесь будет сайт по вордпресс