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

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

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

Если не очищать базу, со временем могут возникать задержки в админке, рост размера базы данных и повышенные затраты на резервирование. Важно правильно настроить автоматическое удаление старых заказов, чтобы не потерять важные данные и не повредить целостность базы.

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

1. Определение условий удаления заказов

Рекомендуется удалять заказы, которые имеют статус completed или cancelled и старше определённого количества дней, например 30 дней. Заказы с активным статусом (например, processing или on-hold) удалять не следует.

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

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

function wpcodex_delete_old_wc_orders() {
    $days = 30; // количество дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'status' => array('completed', 'cancelled'),
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

3. Запуск удаления по расписанию с WP-Cron

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

if (!wp_next_scheduled('wpcodex_delete_old_wc_orders_cron')) {
    wp_schedule_event(time(), 'weekly', 'wpcodex_delete_old_wc_orders_cron');
}

add_action('wpcodex_delete_old_wc_orders_cron', 'wpcodex_delete_old_wc_orders');

4. Удаление запланированного события при деактивации плагина или темы

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

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

  • Выполните вручную вызов функции wpcodex_delete_old_wc_orders() через WP-CLI или временно добавьте вызов в functions.php и обновите сайт.
  • Проверьте, что заказы старше 30 дней с нужными статусами удалились из базы (через админку WooCommerce или напрямую в таблице wp_posts с post_type = 'shop_order').
  • Просмотрите журнал ошибок и убедитесь, что нет фатальных ошибок.
  • Убедитесь, что новые заказы не затронуты.

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

  • Не удаляются заказы: Проверьте, что статусы заказов в фильтре соответствуют реальным (можно вывести через wc_get_order_statuses()).
  • Функция не запускается по Cron: Убедитесь, что WP-Cron работает (проверьте wp-cron.php и нет запретов на его вызов в .htaccess или настройках хостинга).
  • Удаление происходит не полностью: Используйте wp_delete_post($order_id, true) для полного удаления с метаданными, а не только перемещение в корзину.
  • Потеря данных: Перед внедрением сделайте резервную копию базы. Не удаляйте заказы в статусах processing и on-hold, если они еще актуальны.

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

  • Запускайте удаление в период низкой нагрузки сайта, чтобы избежать задержек.
  • Если заказов очень много, делайте удаление пакетами (например, по 50 заказов за один запуск), чтобы не превышать лимиты памяти и времени выполнения.
  • Добавьте логирование удалённых заказов в отдельный файл для контроля.
  • Регулярно делайте резервные копии базы перед запуском очисток.

Таблица сравнения способов автоматического удаления заказов

МетодПреимуществаНедостатки
WP-Cron + wp_delete_post()Простое внедрение, не требует плагинов, гибкость условийЗависит от WP-Cron, возможны проблемы на слабом хостинге
Плагины очистки базы (например, WP-Optimize)Интерфейс, дополнительные функции оптимизацииМогут удалять лишнее, не всегда гибкие условия удаления заказов
SQL-запросы в базе (через расписание сервера)Быстрое удаление, не зависит от WP-CronРиск повреждения данных, требуется опыт работы с SQL
Как автоматически отправлять отзывы WordPress на email с примером кода
20.03.2026
Как создать собственный виджет WordPress своими руками
20.11.2025
WooCommerce: как реализовать авторизацию через SMS с OTP и кодом подтверждения
09.06.2026
WordPress: как создать плагин для авторизации по телефонному номеру
23.12.2025
WooCommerce: как автоматически удалять старые заказы
20.06.2026