Автоматическое удаление старых заказов в 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Опытные администраторы, экстренные случаи
Как использовать WP REST API для создания простого плагина в WordPress
12.02.2026
Как запретить регистрацию ботов в WordPress без плагинов
19.03.2026
Как удалить пустые и неактивные регистрации пользователей в WordPress
20.01.2026
Как создать и настроить автоматический бэкап WordPress
12.11.2025
Оптимизация WooCommerce: как автоматически удалять старые статусы заказов через функции
20.05.2026