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

Диагностика проблемы неоплаченных заказов в WooCommerce

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

Как узнать, есть ли такая проблема? В административной панели WooCommerce перейдите в раздел Заказы и отфильтруйте по статусу ожидает оплаты (pending). Если их количество растёт и не уменьшается, значит автоочистка не работает.

Также можно проверить в базе данных через phpMyAdmin или SQL-запросом:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';

Если количество большое и растёт — пора автоматизировать очистку.

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

Почему стандарт WooCommerce не удаляет такие заказы

WooCommerce по умолчанию меняет статус неоплаченного заказа через 60 минут на «Отменён», но не удаляет запись из базы. Это сделано для сохранения истории, но в некоторых проектах это нежелательно.

Решение: скрипт для удаления заказов старше N дней со статусом «ожидает оплаты»

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

function wpteam_delete_old_pending_orders() {
    $days = 3; // Параметр: удалять заказы старше 3 дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'status' => 'pending',
        'date_before' => $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление
        }
    }
}

// Хук для запуска по крону
add_action('wpteam_delete_pending_orders_cron', 'wpteam_delete_old_pending_orders');

// Регистрируем событие, если его ещё нет
if (!wp_next_scheduled('wpteam_delete_pending_orders_cron')) {
    wp_schedule_event(time(), 'daily', 'wpteam_delete_pending_orders_cron');
}

Этот код настроит ежедневное удаление всех неоплаченных заказов старше 3 дней.

Настройка периодичности и времени запуска

По умолчанию используется интервал daily (один раз в сутки). Для более частого удаления, например, раз в час, можно зарегистрировать кастомный интервал:

add_filter('cron_schedules', function($schedules){
    if(!isset($schedules['hourly'])) {
        $schedules['hourly'] = array(
            'interval' => 3600,
            'display' => __('Каждый час')
        );
    }
    return $schedules;
});

// Заменить wp_schedule_event(time(), 'daily', ...) на 'hourly'

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

Чтобы убедиться, что скрипт работает, выполните следующие действия:

  • Создайте тестовый заказ в статусе «ожидает оплаты» с датой создания более 3 дней назад (можно вручную в базе изменить дату заказа в wp_posts.post_date).
  • Запустите вручную крон-событие, добавив в functions.php временный вызов do_action('wpteam_delete_pending_orders_cron'); и обновите сайт.
  • Проверьте, что заказ удалился через админку или SQL-запросом.

Если всё прошло успешно, удаление работает.

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

  • Заказы не удаляются: проверьте, не блокирует ли ваш хостинг WP-Cron. Попробуйте запускать задачи вручную через WP-CLI: wp cron event run wpteam_delete_pending_orders_cron.
  • Удаляются не все заказы: убедитесь, что дата и статус фильтруются правильно, проверьте, что параметры в wc_get_orders корректны.
  • Заказы удаляются, но остались связанные метаданные: при принудительном удалении через wp_delete_post($id, true) все данные удаляются, но если используете кастомные таблицы, очистите их отдельно.

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

  • Всегда делайте резервные копии базы перед автоматическим удалением заказов.
  • Не устанавливайте слишком короткий срок жизни заказов — учитывайте время клиента на оплату.
  • Используйте WP-CLI для отладки и принудительного запуска задач.
  • Если заказов много, подумайте об удалении пачками (например, по 100 штук), чтобы избежать превышения лимитов памяти или таймаутов.

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

МетодПлюсыМинусыПример
Ручное удаление в админке WooCommerce Просто, не требует кода Трудозатратно при большом объёме заказов Админка → Заказы → Фильтр → Удалить
Плагин для очистки заказов Автоматизация без кода Может нагружать сайт, зависит от плагина Плагины типа "WooCommerce Order Cleaner"
Кастомный код с WP-Cron Гибкость, контроль над логикой и периодичностью Требует навыков разработки Пример кода выше
Как добавить динамические метаданные в WordPress по условию
31.03.2026
WooCommerce: автоматическое удаление товаров по неактивности и дате обновления
21.05.2026
Как удалить постоянные редиректы в WordPress
28.03.2026
WooCommerce: как удалить варианты товаров на основе атрибутов
26.04.2026
WooCommerce: автоматическое удаление неактивных заказов по срокам
12.06.2026

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