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

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

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

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

  • Рост количества заказов со статусом pending или on-hold без оплаты;
  • Замедление работы страниц с заказами в админ-панели;
  • Сложности с поиском и фильтрацией заказов из-за большого объёма «зависших» записей;
  • Повышенная нагрузка на базу данных и резервное копирование.

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

1. Выбор времени хранения неоплаченных заказов

Рекомендуется устанавливать период в 1-2 дня, чтобы дать пользователю достаточно времени на оплату, но не накапливать мусор.

2. Создание кастомного WP-Cron для удаления заказов

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

<?php
// Регистрация кастомного события
add_action('wp', 'register_delete_unpaid_orders_cron');
function register_delete_unpaid_orders_cron() {
    if (!wp_next_scheduled('delete_unpaid_orders_daily')) {
        wp_schedule_event(time(), 'daily', 'delete_unpaid_orders_daily');
    }
}

// Хук для удаления заказов
add_action('delete_unpaid_orders_daily', 'delete_unpaid_orders_by_date');

function delete_unpaid_orders_by_date() {
    $days_to_keep = 2; // Сколько дней хранить неоплаченные заказы
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days"));

    $args = [
        'status' => ['pending', 'on-hold'],
        'date_created' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Полное удаление заказа
    }
}

// Очистка расписания при деактивации плагина
register_deactivation_hook(__FILE__, function() {
    $timestamp = wp_next_scheduled('delete_unpaid_orders_daily');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'delete_unpaid_orders_daily');
    }
});
?>

3. Тестирование и принудительный запуск задачи

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

delete_unpaid_orders_by_date();

Или через WP-CLI:

wp cron event run delete_unpaid_orders_daily

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

  • Проверьте наличие неоплаченных заказов старше 2 дней через админку WooCommerce или SQL-запросом:
    SELECT ID FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') AND post_date < NOW() - INTERVAL 2 DAY;
  • После запуска крона эти заказы должны исчезнуть;
  • Убедитесь, что новые неоплаченные заказы младше 2 дней не удаляются;
  • Просмотрите логи ошибок и крона на предмет сбоев.

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

  • Заказы не удаляются: проверьте, что WP-Cron работает (например, посетите сайт или используйте системный CRON-запуск); убедитесь, что хук зарегистрирован корректно;
  • Удаляются оплаченные или нужные заказы: проверьте фильтр статусов в wc_get_orders, используйте правильные статусы pending и on-hold с префиксом wc- (например, wc-pending);
  • Повышенная нагрузка при большом числе заказов: добавьте лимит и пагинацию в запрос, обрабатывайте партии заказов по 50-100 штук;
  • Проблемы с правами на удаление: убедитесь, что код выполняется от имени администратора (обычно это так для WP-Cron);
  • Заказы не удаляются из базы: wp_delete_post с параметром true удаляет полностью, но если есть сторонние плагины с кастомной логикой удаления, проверьте их совместимость.

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

  • Используйте wp_cron с осторожностью: на больших сайтах лучше настроить системный CRON для запуска wp-cron.php каждые 5-15 минут;
  • Добавьте логирование удалённых заказов для восстановления и аудита;
  • При большом объёме заказов используйте пакетную обработку с пагинацией, чтобы избежать таймаутов;
  • Регулярно очищайте кэш WooCommerce (если используется) после массового удаления заказов;
  • При использовании плагинов для отчётов проверьте, что их данные не нарушаются удалением заказов;
  • Рассмотрите использование плагина Clearfy Pro для оптимизации и очистки сайта https://wpshop.ru/plugins/clearfy?utm_source=wpcoder.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-neoplachennyh-zakazov

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

МетодПлюсыМинусыКомпромисс
WP-Cron с кастомной функциейПолный контроль, гибкость настройки, без сторонних плагиновЗависимость от запуска WP-Cron, возможна нагрузка при большом объёмеНастроить системный CRON для надежности
Плагины очистки заказов (например, WooCommerce Cleanup)Простота настройки, готовый функционалМогут быть платными, не всегда гибкиеИспользовать для небольших магазинов
Ручной SQL-запрос для удаленияБыстрый однократный результатРиск повреждения данных, нет автоматизацииИспользовать только для разовых операций с бэкапом
Как использовать REST API в WordPress для расширения функциональности
10.11.2025
Как отладить проблемы с AJAX в WordPress
07.04.2026
WordPress отладка проблем с кэшем и кэш-плагинами: практические решения
08.12.2025
Автоматическое удаление неиспользуемых метаполей в WordPress
22.03.2026
Как добавить поддержку WebP в WordPress: практическое руководство
14.04.2026