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

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

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

Основная задача — автоматически удалять неоплаченные заказы, которые не были оплачены в течение заданного периода (например, 24 часа или 3 дня), чтобы поддерживать базу данных в порядке и админку — удобной.

Как определить неоплаченный заказ в WooCommerce

В WooCommerce неоплаченный заказ — это заказ со статусом pending, failed или on-hold, который не перешёл в статус processing или completed. Для удаления пригодны заказы, которые не изменяли статус дольше заданного времени.

Определение времени заказа

Время создания заказа хранится в поле post_date в таблице wp_posts. Мы будем использовать его, чтобы вычислить, какие заказы устарели.

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

Для автоматизации удаления создадим функцию и подключим её к регулярному событию WP-Cron.

1. Добавляем функцию удаления

function wc_delete_unpaid_orders() {
    $interval_hours = 24; // Время в часах для удаления неоплаченных заказов
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $interval_hours . ' hours'));

    $args = array(
        'status' => array('pending', 'failed', 'on-hold'),
        'date_created' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    );

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

2. Регистрируем WP-Cron событие

function wc_schedule_unpaid_orders_cleanup() {
    if (!wp_next_scheduled('wc_unpaid_orders_cleanup_hook')) {
        wp_schedule_event(time(), 'hourly', 'wc_unpaid_orders_cleanup_hook');
    }
}
add_action('wp', 'wc_schedule_unpaid_orders_cleanup');

add_action('wc_unpaid_orders_cleanup_hook', 'wc_delete_unpaid_orders');

3. Остановка cron задачи при деактивации темы или плагина

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

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

  • Создайте тестовый заказ со статусом pending и выставьте дату создания более 24 часов назад (через БД или вручную).
  • Запустите cron задачу вручную, например, добавив временный вызов wc_delete_unpaid_orders(); в functions.php.
  • Проверьте, что заказ удалён из админки WooCommerce и из таблицы wp_posts.
  • Убедитесь, что заказы со статусом completed или processing не удалились.

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

  • Проверка статуса заказа: Использование некорректных статусов или отсутствие проверки даты создаёт риск удаления важных заказов. Используйте только статусы, не связанные с оплачеными заказами.
  • Проблемы с WP-Cron: Если WP-Cron не работает из-за низкого трафика или отключен, задача не запустится. Для теста запускайте функцию вручную.
  • Удаление заказов не происходит: Проверьте права пользователя, под которым работает сайт, и не блокирует ли функция wp_delete_post удаление.
  • Удаление заказов с привязками: Если заказ связан с другими записями (например, подписками), удаление может привести к ошибкам. В таком случае нужна дополнительная логика.

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

  • Удаляйте заказы только после тщательной проверки статуса и времени создания — чтобы избежать потери данных.
  • Для больших магазинов с тысячами заказов используйте limit в запросах, чтобы не перегружать сервер.
  • Рассмотрите использование плагинов типа Clearfy для дополнительно чистки базы.
  • Регулярно делайте резервные копии перед внедрением автоматического удаления.
  • Мониторьте логи ошибок сервера и WordPress для своевременного выявления проблем.

Сравнение способов реализации

МетодОписаниеПлюсыМинусы
WP-Cron + код в functions.php Самый простой способ написать функцию и запустить на cron Полный контроль, бесплатно, гибко Зависит от работы WP-Cron, требует навыков программирования
Плагин для очистки заказов Использование готовых решений для удаления старых заказов Быстро, не требует кода, поддержка обновлений Может быть избыточным, не всегда гибок
Ручное удаление в админке Удаление заказов вручную через админку Просто, не требует навыков Не подходит для большого количества заказов, риск пропуска
Как добавить дополнительные поля в WP REST API для кастомных типов записей
05.02.2026
Как добавить дополнительные типы пользователей в WordPress и управлять их правами
11.03.2026
Удаление неиспользуемых таблиц из базы данных WordPress для оптимизации сайта
11.01.2026
Как удалить или изменить определённые записи WooCommerce после оформления заказа
04.07.2026
Как автоматизировать создание и обновление sitemap в WordPress
07.04.2026