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

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

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

Как определить, какие заказы удалять

Стандартный подход — удалять заказы со статусом completed, которые старше определённого срока, например, 30 или 90 дней. Важно убедиться, что такие заказы не нужны для отчетности или бухгалтерии, иначе удаление может привести к потере данных.

Проверка заказов в базе

Для начала можно вручную проверить заказы старше 90 дней через SQL-запрос (замените wp_ на префикс вашей таблицы):

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < DATE_SUB(NOW(), INTERVAL 90 DAY);

Этот запрос покажет список заказов, подходящих под критерий удаления.

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

Реализуем функцию на PHP, которая удалит заказы старше 90 дней со статусом completed. Затем добавим задачу в WP-Cron для регулярного запуска.

Шаг 1. Создание функции удаления заказов

function wpreset_delete_old_completed_orders() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-90 days'));

    // Получаем ID заказов для удаления
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'shop_order' 
         AND post_status = 'wc-completed' 
         AND post_date < %s",
         $date_threshold
    ));

    if (empty($order_ids)) {
        return;
    }

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // true - без перемещения в корзину
    }
}

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

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

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

add_action('wpreset_daily_order_cleanup_hook', 'wpreset_delete_old_completed_orders');

Шаг 3. Проверка работы

  • Зайдите в админку WordPress > Инструменты > Запланированные задачи (если установлен плагин WP Crontrol) и убедитесь, что задача wpreset_daily_order_cleanup_hook активна.
  • Для принудительного теста запустите функцию wpreset_delete_old_completed_orders() вручную, например, через functions.php или консоль WP-CLI.
  • Проверьте, что заказы старше 90 дней со статусом completed удалены (через админку WooCommerce или SQL-запрос).

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

  • Заказы не удаляются. Проверьте, что хук WP-Cron действительно срабатывает. Используйте плагин WP Crontrol для диагностики.
  • Удаляются нужные заказы. Убедитесь, что дата и статус указаны корректно. Возможно, стоит увеличить период хранения.
  • Ошибка базы данных. Проверьте права доступа к базе и корректность SQL-запроса.
  • Функция не подключена. Убедитесь, что код добавлен в активную тему или плагин и не вызывает ошибок.

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

  • Перед удалением заказов сделайте резервную копию базы данных.
  • Если база очень большая, удаляйте заказы партиями, чтобы избежать таймаутов. Например, добавьте лимит в SQL и запускайте функцию несколько раз.
  • Отслеживайте логи ошибок и работу WP-Cron, чтобы вовремя заметить сбои.
  • Чтобы не тормозить сайт, ставьте задачу на низкую нагрузку по времени (например, ночью).

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

МетодПреимуществаНедостаткиКомпромисс
Ручное удаление через админкуПростота, контрольТрудозатратно при большом объёмеПодходит для малых магазинов
SQL-запросы в базеБыстро, гибкоРиск удаления лишнего, требует навыковИспользовать с резервным копированием
Автоматизация через WP-Cron и PHPАвтоматично, безопасно при правильной настройкеТребует программирования и тестированияОптимальный вариант для больших магазинов
Плагины очистки базы (например, Clearfy Pro)Удобный интерфейс, дополнительные функцииМожет влиять на производительность, платныеИспользовать при необходимости расширенного функционала
Как автоматизировать удалённые задачи в WordPress без плагинов
09.02.2026
Как автоматически удалять старый контент в WordPress по установленным правилам
07.04.2026
Как создать свой шорткод в WordPress с примерами кода
17.11.2025
Как использовать WP-Cron для автоматического удаления старого контента в WordPress
11.05.2026
WooCommerce: автоматическое удаление товаров по дате и статусу
14.07.2026