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

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

С течением времени в базе WooCommerce накапливаются заказы, которые уже не актуальны: отменённые, отменённые по истечении срока, или не оплаченные. Это может замедлять работу сайта, увеличивать нагрузку на базу данных и создавать неудобства при администрировании. Автоматическое удаление таких заказов помогает поддерживать чистоту данных и оптимизировать работу магазина.

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

Для диагностики можно проверить количество заказов со статусом cancelled, failed и pending, которые не менялись длительное время. Например, выполните SQL-запрос в базе данных:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed', 'wc-pending') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Если количество таких заказов велико (сотни или тысячи), стоит задуматься об автоматической очистке.

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

1. Создаём функцию для удаления заказов старше N дней с определённым статусом

function wpkpi_delete_old_orders() {
    $days = 30; // Срок в днях
    $statuses = ['wc-cancelled', 'wc-failed', 'wc-pending'];

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => [
            [
                'column'    => 'post_date',
                'before'    => "$days days ago",
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление
        }
    }
}

2. Запускаем функцию по расписанию с помощью WP-Cron

Добавим событие, если оно ещё не было добавлено:

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

add_action('wpkpi_daily_order_cleanup', 'wpkpi_delete_old_orders');

3. Опционально: удаление заказов вручную через консоль WP-CLI

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

wp eval 'wpkpi_delete_old_orders();'

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

  • Зайдите в админ-панель WooCommerce > Заказы и отфильтруйте заказы по статусам Отменён, Не оплачен и Ошибка оплаты. Проверьте, что заказы старше 30 дней исчезли.
  • Проверьте таблицу wp_posts в базе данных, убедитесь, что старые заказы удалены.
  • Просмотрите логи WP-Cron (например, с помощью плагина WP Crontrol), чтобы убедиться, что событие выполняется ежедневно.

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

  • Заказы не удаляются: убедитесь, что в вашем WP-Cron работают события. Если сайт мало посещаем, WP-Cron может не запускаться — рассмотрите настройку системного cron на сервере.
  • Удаляются не те заказы: проверьте правильность статусов в массиве $statuses и дату в параметре date_query. Для проверки выполните WP_Query отдельно и выведите найденные ID.
  • Потеря данных: функция wp_delete_post($order_id, true) удаляет заказ полностью. Если хотите сохранить данные, используйте false для мягкого удаления.
  • Нагрузка на базу: если заказов много, разбейте удаление на пачки по 50-100 штук, чтобы избежать тайм-аутов и нагрузок.

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

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

Сравнение вариантов удаления заказов

МетодПреимуществаНедостатки
WP-Cron + PHP (пример выше)Полная интеграция с WordPress, гибкость, безопасностьЗависит от посещаемости сайта, может не сработать вовремя
Системный cron + WP-CLIНадёжный запуск, подходит для больших сайтовТребует доступа к серверу, настройка сложнее
Плагины очистки заказовПростота настройки, готовые решенияМожет добавлять нагрузку, не всегда гибко
WooCommerce: автоматическое удаление неактивных клиентов по дате последнего заказа
11.06.2026
Как отладить проблемы с отправкой форм в WordPress
01.04.2026
Оптимизация загрузки библиотек jQuery и других скриптов в WordPress
08.04.2026
WooCommerce: автоматическое удаление заказов по истечении срока
04.06.2026
WooCommerce: массовое обновление цен товаров через код
24.06.2026