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

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

В интернет-магазинах на WooCommerce со временем накапливаются заказы в разных статусах. Закрытые (completed, cancelled, refunded) заказы обычно не нужны для активной работы, но занимают место в базе данных, замедляя запросы к таблицам wp_posts и wp_postmeta. Автоматическое удаление старых закрытых заказов помогает поддерживать чистоту базы и оптимизировать производительность без потери актуальных данных.

Проверьте, сколько заказов в статусах completed, cancelled или refunded за определённый период (например, старше 180 дней):

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

Если число большое — имеет смысл автоматизировать удаление.

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

1. Создаем функцию удаления заказов по статусам и дате

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

function wprus_delete_old_closed_orders() {
    global $wpdb;

    $statuses = [ 'wc-completed', 'wc-cancelled', 'wc-refunded' ];
    $days = 180; // количество дней, старше которых удаляем

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

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

2. Настраиваем Cron-задачу для регулярного запуска

Добавьте запуск функции ежедневно:

add_action('wprus_daily_order_cleanup', 'wprus_delete_old_closed_orders');

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

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

Чтобы не создавать «мусор» в расписании задач, добавьте удаление Cron при деактивации:

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

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

  • Посмотрите в админке WooCommerce → Заказы — старые закрытые заказы должны исчезать через сутки после активации.
  • Проверьте таблицы базы данных wp_posts и wp_postmeta: записи старых заказов должны быть удалены.
  • Включите логирование для wp_delete_post, если нужно отследить удаление конкретных заказов.

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

  • Заказы не удаляются: проверьте, срабатывает ли Cron. Для теста запустите функцию вручную через wp-cli или вызов напрямую из админки.
  • Удаляются не те заказы: перепроверьте статусы и дату в SQL-запросе.
  • Удаление занимает много времени: на больших базах разбейте удаление на части, например, обрабатывайте по 100 заказов за запуск.
  • Потеря данных нужна частичная: вместо полного удаления используйте смену статуса или архивирование.

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

  • Резервное копирование: перед внедрением автоматического удаления заказов обязательно настройте регулярное резервное копирование базы данных.
  • Проверка Cron: используйте плагины Debug Bar или WP Crontrol для мониторинга работы Cron-событий.
  • Оптимизация запросов: индексируйте колонки post_status и post_date для ускорения выборок.
  • Логирование действий: добавьте записи в лог при удалении заказов для восстановления при ошибках.

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПросто, не требует кодаТрудоемко, не подходит для больших объемов
Плагин (например, WP Bulk Delete)Упрощает удаление, настройки через UIМожет влиять на производительность, лишний плагин в системе
Код с Cron (предложенный вариант)Автоматизация, контроль, без лишних плагиновТребует навыков разработки, настройка Cron
WooCommerce: как изменить стиль кнопки «Добавить в корзину» при добавлении товара
02.05.2026
Как удалить автосохранения и ревизии постов в WordPress: эффективные способы и примеры
05.01.2026
WooCommerce: как изменить стиль кнопки «Добавить в корзину» при добавлении товара
07.06.2026
Как удалить загруженные файлы из медиатеки WordPress полностью
02.12.2025
Как изменить вывод информации пользователя WooCommerce по ролям
30.03.2026
×

AI-плагин от WPShop.ru

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

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше