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

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

Большие магазины на WooCommerce со временем накапливают тысячи заказов, что существенно увеличивает размер базы данных и замедляет работу сайта. WooCommerce по умолчанию не очищает старые заказы автоматически, и это влияет на производительность, резервное копирование и общий отклик сайта.

Удаление старых заказов помогает:

  • Оптимизировать базу данных и ускорить запросы.
  • Снизить нагрузку при создании резервных копий.
  • Упростить управление данными и отчетность.

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

Для начала определите, сколько заказов сейчас хранится в базе. Используйте SQL-запрос через phpMyAdmin или WP CLI:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order';

Если число заказов превышает 50 000 и вы заметили замедления при работе с заказами в админке или рост размера дампа базы — пора оптимизировать.

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

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

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

function wptemp_delete_old_orders() {
    global $wpdb;
    $days = 90; // количество дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // Получаем ID заказов старше $days с нужным статусом
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_date < %s",
        $date
    ));

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

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

Добавьте код для регистрации ежедневного задания:

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

add_action('wptemp_daily_delete_old_orders', 'wptemp_delete_old_orders');

3. Проверка работы задачи

Чтобы проверить, что задача срабатывает, добавьте временный лог:

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

    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_date < %s",
        $date
    ));

    if (!empty($order_ids)) {
        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true);
        }
        error_log('Deleted ' . count($order_ids) . ' old orders');
    } else {
        error_log('No old orders to delete');
    }
}

Логи смотрите в wp-content/debug.log при включенном WP_DEBUG_LOG.

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

  • Зайдите в админку WooCommerce — заказы старше указанного возраста должны исчезнуть.
  • Проверьте размер таблиц wp_posts и wp_postmeta через phpMyAdmin — должен быть заметен спад.
  • Отслеживайте логи для подтверждения, что задача выполняется регулярно.

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает (например, запустите вручную через WP-CLI wp cron event run wptemp_daily_delete_old_orders).
  • Удаляются не все заказы: Убедитесь, что в выборке учитываются все нужные статусы заказов или добавьте фильтр по статусу, если хотите удалять только завершённые/отменённые заказы.
  • Проблемы с правами: wp_delete_post требует прав администратора — убедитесь, что код запускается с нужными правами или из контекста WP-Cron.

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

  • Резервное копирование: Перед автоматическим удалением включите резервное копирование базы — можно использовать Clearfy Pro для автоматизации https://wpshop.ru/plugins/clearfy?source=wptemp.ru&medium=article&campaign=woocommerce-avto-udaleniye-staryh-zakazov.
  • Оптимизация запросов: Используйте индексированные поля для выборки заказов, избегайте перебора всех заказов сразу.
  • Выборочный режим: Для больших баз делайте удаление партиями, например, по 500 заказов за раз, чтобы не перегружать сервер.

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

МетодПлюсыМинусыКогда использовать
Код на WP-CronКонтроль, без сторонних плагинов, гибкостьНужно писать и тестировать, зависит от WP-CronМалые и средние магазины, контроль выполнения
Плагины очистки базы (например, WP-Optimize)Простота, интерфейс, дополнительные функции оптимизацииНагрузка на сервер при запуске, возможно избыточноБыстрый запуск без разработки
Ручное удаление через SQLМаксимальная скорость, полный контрольРиск ошибок, требует навыков SQLОпытные администраторы, экстренные случаи
Как удалить пустые и неактивные регистрации пользователей в WordPress
20.01.2026
Как настроить безопасные AJAX-запросы в WordPress
07.03.2026
Как создать собственный виджет WordPress: практическое руководство
15.11.2025
WooCommerce AJAX-корзина не обновляется из-за кэширования: диагностика и исправление
07.08.2026
Как использовать WP-CLI для управления темами и плагинами WordPress
29.01.2026