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

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

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

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

Как проверить наличие проблемы

  • В админке WooCommerce перейдите в раздел Заказы.
  • Отфильтруйте заказы по статусу pending или failed.
  • Проверьте даты создания заказов: если есть неоплаченные заказы старше нужного срока (например, 7 дней), значит автоматическое удаление не настроено.
  • Для оценки нагрузки запросом к базе можно выполнить SQL-запрос:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 7 DAY;

Если количество заказов велико, это подтверждает необходимость автоматизации очистки.

Пошаговое решение: удаление неоплаченных заказов через WP-Cron

1. Написание функции удаления

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

function wpteam_delete_expired_unpaid_orders() {
    $days = 7; // количество дней после которого заказы считаются устаревшими
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    $args = [
        'post_type' => 'shop_order',
        'post_status' => ['wc-pending', 'wc-failed'],
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];
    
    $orders = get_posts($args);
    
    if (empty($orders)) {
        return;
    }
    
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление без корзины
    }
}

2. Регистрация WP-Cron задачи

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

if (!wp_next_scheduled('wpteam_delete_unpaid_orders_event')) {
    wp_schedule_event(time(), 'daily', 'wpteam_delete_unpaid_orders_event');
}

add_action('wpteam_delete_unpaid_orders_event', 'wpteam_delete_expired_unpaid_orders');

3. Отмена задачи при деактивации

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

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

  • Проверьте, что после запуска cron-задачи (можно вызвать вручную через WP-CLI или временно заменить 'daily' на 'hourly') в разделе заказов исчезают заказы старше 7 дней с статусом "ожидает оплаты" и "неудачный".
  • Для проверки можно использовать WP-CLI команду:
wp post list --post_type=shop_order --post_status=wc-pending --field=ID --date_query_before='7 days ago'

Если после выполнения cron-задачи таких заказов нет, значит скрипт работает корректно.

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

1. Скрипт не запускается по расписанию

  • Проверьте, что WP-Cron включен и работает.
  • Убедитесь, что нет конфликтов с плагинами, отключающими WP-Cron.
  • Можно настроить системный cron на вызов wp-cron.php для надежности.

2. Заказы не удаляются

  • Проверьте права пользователя, под которым выполняется WP-Cron (должен иметь права на удаление заказов).
  • Проверьте, не мешают ли хуки или плагины отменять удаление.
  • Для отладки добавьте логирование:
function wpteam_delete_expired_unpaid_orders() {
    // ...
    foreach ($orders as $order_id) {
        if (wp_delete_post($order_id, true)) {
            error_log("Order {$order_id} deleted");
        } else {
            error_log("Failed to delete order {$order_id}");
        }
    }
}

3. Удаление не тех заказов

  • Проверьте параметры post_status и date_query в запросе.
  • Проверьте, что дата учитывается в правильном часовом поясе.

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

  • Для больших магазинов избегайте удаления большого числа заказов за один запуск — можно разбить на порции с помощью posts_per_page и пагинации.
  • Перед удалением сделайте резервную копию базы данных.
  • Если заказы важны для отчетности, рассмотрите архивирование вместо удаления.
  • Реализуйте логирование удаления в отдельный файл для аудита.
  • Используйте WP-CLI для принудительного запуска и тестирования скрипта без ожидания cron.

Сравнение вариантов автоматического удаления заказов

СпособПлюсыМинусы
Плагин очистки заказов (например, WooCommerce Cleanup)Простота установки, настройка через UIМожет нагружать сайт, ограниченные настройки
Код с WP-Cron (как в статье)Гибкость, контроль, минимально нагружает серверТребует навыков программирования, нужно отлаживать
Ручное удаление через SQLБыстро, подходит для разовых задачРиск ошибки, нет автоматизации
Как изменить размер и оптимизировать изображения в WordPress без плагинов
05.12.2025
WooCommerce: автоматическое удаление товаров из корзины по атрибутам после оплаты
25.05.2026
Автоматический импорт данных из Яндекс.Таблиц в WordPress
15.03.2026
WooCommerce: автоматическое удаление неактивных заказов по срокам
12.06.2026
WooCommerce: автоматическое удаление неоплаченных заказов с помощью кода
22.06.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.