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

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

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

Типичная ситуация: заказы со статусом pending или failed висят месяцами без оплаты. Их нужно удалить или архивировать через определённый срок, чтобы оптимизировать работу магазина.

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

  • В админке WooCommerce перейдите в Заказы и отфильтруйте по статусам pending, failed.
  • Обратите внимание на дату создания заказа — если там есть заказы старше 30 дней, их лучше удалить.
  • Для точной проверки используйте SQL-запрос в базе данных или WP-CLI:
wp wc order list --status=pending,failed --after=30 days ago --format=ids

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

1. Создание крон-задачи в WordPress

Для регулярного удаления создадим WP-Cron задачу, которая будет запускаться один раз в сутки.

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

2. Функция удаления заказов по сроку

Добавим функцию, которая будет удалять заказы со статусом pending и failed старше 30 дней.

function custom_clear_old_unpaid_orders() {
    $days = 30; // Срок в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Полное удаление заказа
    }
}
add_action( 'custom_clear_old_unpaid_orders_hook', 'custom_clear_old_unpaid_orders' );

3. Проверка работы WP-Cron

Для отладки используйте плагин WP Crontrol, чтобы убедиться, что задача custom_clear_old_unpaid_orders_hook запланирована и выполняется.

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

  • Зайдите в раздел Заказы WooCommerce и отфильтруйте заказы по статусам pending и failed.
  • Проверьте, что заказы старше 30 дней исчезли из списка.
  • Для дополнительной проверки запустите функцию вручную или используйте WP-CLI:
wp eval 'custom_clear_old_unpaid_orders();'

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

  • Заказы не удаляются: Проверьте, есть ли у пользователя, под которым запускается cron, права на удаление записей. Убедитесь, что WP-Cron работает (проверьте серверные cron или плагин WP Crontrol).
  • Удаляются нужные заказы: Проверьте правильность фильтрации даты и статусов. Не используйте статус processing или completed в критериях.
  • Заказы остаются в базе, но не отображаются в админке: Возможно, используется кеширование или сторонние плагины, которые задерживают отображение. Очистите кэш.

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

  • Резервное копирование: Перед внедрением автоматического удаления настройте регулярное резервное копирование базы данных.
  • Ограничение удаления: Устанавливайте разумный срок (например, 30 дней), чтобы не удалять потенциально важные заказы.
  • Отложенный запуск: Если у вас большой магазин, делайте удаление партиями, чтобы не перегружать сервер.
  • Логирование: Добавьте логирование удалений для аудита и отката ошибок:
function custom_clear_old_unpaid_orders() {
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

    $orders = wc_get_orders($args);
    $deleted_count = 0;

    foreach ($orders as $order_id) {
        if (wp_delete_post($order_id, true)) {
            $deleted_count++;
        }
    }

    error_log("WooCommerce: удалено старых неоплаченных заказов - {$deleted_count}");
}
add_action( 'custom_clear_old_unpaid_orders_hook', 'custom_clear_old_unpaid_orders' );

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

СпособПлюсыМинусыРекомендации
Ручное удаление через админку Просто, не требует кода Трудозатратно при большом объеме, риск пропусков Подходит для небольших магазинов
Автоматизация через WP-Cron Удаление по расписанию, экономия времени Требует базовых навыков разработки, зависит от работы WP-Cron Оптимально для средних и больших магазинов
Плагины очистки заказов Готовые решения с настройками Может влиять на производительность, лишние зависимости Использовать, если нет ресурсов на разработку
WooCommerce: как настроить автоматическое отключение платежных систем при неоплате заказа по IP
17.07.2026
WooCommerce: автоматическое удаление старого неоплаченного заказа с подробной настройкой
01.07.2026
Как создать автоматические переадресации в WordPress: практические решения и примеры кода
19.12.2025
Как автоматизировать управление пользовательскими ролями в WordPress
06.02.2026
Автоматическое удаление спама в комментариях WordPress
24.02.2026