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

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

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

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

Пояснение: что считаются неоплаченными заказами

Заказы со статусом pending (ожидает оплаты) или failed (неудачная оплата) считаются неоплаченными. Иногда в магазинах встречается статус on-hold, но его стоит рассматривать отдельно в зависимости от бизнес-логики.

Реализация: планировщик WP-Cron и кастомная функция удаления

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

<?php
// Интервал для WP-Cron: раз в сутки
add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['daily_custom'])) {
        $schedules['daily_custom'] = [
            'interval' => 86400, // 24 часа
            'display' => __('Раз в сутки')
        ];
    }
    return $schedules;
});

// Планируем задачу, если ещё не запланирована
if (!wp_next_scheduled('delete_old_unpaid_orders')) {
    wp_schedule_event(time(), 'daily_custom', 'delete_old_unpaid_orders');
}

// Функция удаления заказов
add_action('delete_old_unpaid_orders', function() {
    $days_to_keep = 7; // удалить заказы старше 7 дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days"));

    $args = [
        'status' => ['pending', 'failed'],
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);
    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // Перемещаем заказ в корзину
        // Или wp_delete_post($order_id, true); для полного удаления
    }
});

// Очистка задачи при деактивации плагина
register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('delete_old_unpaid_orders');
});
?>

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

  • Убедитесь, что планировщик запущен — в админке плагинов для WP-Cron или с помощью плагина Clearfy (есть инструмент диагностики Cron).
  • Создайте тестовый заказ со статусом pending и выставьте дату создания более 7 дней назад (можно сделать через phpMyAdmin).
  • Запустите Cron вручную или дождитесь автоматического запуска, затем проверьте, что заказ переместился в корзину или удалён.
  • Проверьте логи сервера и ошибок, чтобы убедиться в отсутствии сбоев.

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

  • WP-Cron не запускается: часто из-за низкой посещаемости сайта. Решение — настроить системный cron на сервере для вызова wp-cron.php, либо использовать плагин для управления cron.
  • Заказы не удаляются: проверьте правильность статусов и формата даты в запросе wc_get_orders. Статусы должны быть корректными (например, pending вместо processing).
  • Удаление заказов приводит к потере данных: используйте сначала wp_trash_post, чтобы можно было восстановить заказ из корзины в админке.
  • Не учитывается часовой пояс: дата сравнения должна учитывать часовой пояс WordPress (используйте current_time('mysql') вместо date(), если нужно).

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

  • Устанавливайте лимит на количество удаляемых заказов за один запуск, чтобы избежать таймаутов. Например, добавить 'limit' => 100 в параметры запроса.
  • Логируйте удалённые заказы — полезно для аудита и отката. Пример: записывать ID и дату удаления в отдельный лог-файл.
  • Регулярно делайте бэкапы базы, особенно перед внедрением автоматического удаления.
  • Используйте Clearfy Pro для мониторинга и оптимизации WooCommerce, если хотите готовое решение с поддержкой.

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

МетодПлюсыМинусыКомпромисс
WP-Cron + кастомный код Гибкость, полный контроль, бесплатно Зависит от корректной работы WP-Cron, требует навыков разработчика Добавить логирование и лимиты для безопасности
Плагины для чистки WooCommerce Простота настройки, интерфейс Могут быть платными, ограничены в настройках Использование вместе с кастомным кодом для особых случаев
Ручная очистка через админку Простая и безопасная Неэффективно при большом количестве заказов Использовать для выборочной очистки
Как создать уникальный фильтрованный список постов в WordPress
01.03.2026
Решение проблемы нестандартных типов полей в WordPress
07.12.2025
Использование хука WooCommerce после завершения заказа для кастомных действий
19.03.2026
Как использовать WooCommerce хуки для автоматизации управления заказами
10.05.2026
Как автоматически отключить REST API для неавторизованных пользователей в WordPress
18.06.2026