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

Диагностика проблемы с накоплением заказов в WooCommerce

При работе интернет-магазинов на WooCommerce в базе данных накапливается большое количество заказов, включая завершённые и отменённые. Это приводит к увеличению размера базы данных, замедлению запросов и повышению нагрузки на сервер. Если магазин не предполагает хранение истории заказов более определённого срока — например, 1 год — имеет смысл автоматизировать удаление устаревших записей.

Чтобы проверить, сколько заказов в базе старше нужного срока, используйте SQL-запрос:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);

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

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

Используем планировщик задач WP-Cron для регулярной очистки

Чтобы удалять заказы старше 1 года без плагинов, добавим код в functions.php вашей темы или в отдельный плагин:

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

add_action('wc_delete_old_orders_daily', 'wc_delete_old_orders');

function wc_delete_old_orders() {
    global $wpdb;
    $date_limit = date('Y-m-d H:i:s', strtotime('-1 year'));
    $orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_date < %s",
        $date_limit
    ));

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — без возможности восстановления
    }
}

Этот код запускает задачу ежедневно, которая удаляет все заказы старше года, включая связанные метаданные и записи в таблицах WooCommerce.

Как проверить, что задача работает

  • В базе данных с помощью SQL-запроса выше проверить количество старых заказов до и после запуска задачи.
  • Включить логирование в коде, добавив error_log('Удалён заказ ID: ' . $order_id); внутри цикла.
  • Использовать плагин WP Crontrol для просмотра и ручного запуска cron-задачи.

Частые ошибки при автоматическом удалении заказов

  • Отсутствие резервного копирования перед удалением. Удалённые данные нельзя восстановить. Всегда делайте бэкап.
  • Удаление заказов с важными данными для бухгалтерии. Убедитесь, что срок хранения соответствует законодательству.
  • Неправильный тип заказа. В WooCommerce есть заказы и возвраты (shop_order_refund) — не удаляйте возвраты случайно.
  • Отсутствие очистки связанных метаданных. Использование wp_delete_post($id, true) решает эту проблему.
  • Нагрузка на сервер при большом количестве заказов. При большом объёме лучше удалять партиями, например по 100 заказов за раз.

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

function wc_delete_old_orders_batch() {
    global $wpdb;
    $date_limit = date('Y-m-d H:i:s', strtotime('-1 year'));
    $orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_date < %s LIMIT 100",
        $date_limit
    ));

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

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}

Замените вызов функции в cron на wc_delete_old_orders_batch, чтобы снижать нагрузку.

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

  • Резервное копирование. Перед внедрением обязательно сделайте полный бэкап базы.
  • Тестирование на staging-сервере. Проверяйте работу функции на тестовом сайте.
  • Мониторинг cron-задач. Используйте плагин WP Crontrol для контроля и диагностики.
  • Ограничение прав доступа. Храните код удаления в плагине или теме с ограниченным доступом, чтобы избежать несанкционированного удаления.
  • Оптимизация базы. После удаления старых заказов выполните оптимизацию таблиц через phpMyAdmin или WP-CLI (wp db optimize).

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

МетодПлюсыМинусыРекомендации
Удаление через SQL-запросБыстрое исполнениеМожет оставить мусор, не удаляет связанные данныеИспользовать с осторожностью, делать бэкап
wp_delete_post() в циклеКорректное удаление всех связанных данныхМожет быть медленным при большом объёмеУдалять партиями, использовать WP-Cron
Плагины очистки базы (например, WP-Optimize)Удобный интерфейс, дополнительные функцииМожет не удалять заказы по нужным критериямИспользовать для общей оптимизации

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

⭐⭐⭐⭐⭐
Как в CyrtoLat проверить и отключить автоподмену в снимках и ревизиях записей
21.09.2026
Как установить и настроить автоматическую транслитерацию URL в WordPress
26.09.2026
Как удалить пустое содержимое из текста постов WordPress: практическое решение
09.09.2026
Как сделать динамические заголовки в WordPress на основе данных
30.09.2026
Как избежать проблем с транслитерацией меток (тегов) в WordPress: практическое руководство
15.09.2026
×

Увеличьте продажи!

Скидка на
My Popup!

-15%
плагин для WordPress

Успей купить ⋙