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

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

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

Часто администраторы сталкиваются с задачей автоматизировать очистку базы заказов по дате и статусу без использования плагинов. В статье рассмотрим, как это реализовать через кастомный код с использованием WP-Cron и WooCommerce API.

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

1. Определяем критерии удаления

В нашем случае нужно удалять заказы со статусом cancelled и completed, которые старше определённого количества дней, например, 90 дней.

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

Ниже пример функции для удаления заказов с нужным статусом и датой:

function wpcore_delete_old_orders() {
    $statuses = array('cancelled', 'completed');
    $days_limit = 90;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_limit} days"));

    foreach ($statuses as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-' . $status,
            'date_query'     => array(
                array(
                    'column' => 'post_date',
                    'before' => $date_threshold,
                ),
            ),
            'posts_per_page' => 100, // Пакет по 100 заказов за раз
            'fields'         => 'ids',
        );

        $query = new WP_Query($args);

        if ($query->have_posts()) {
            foreach ($query->posts as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление
            }
        }
        wp_reset_postdata();
    }
}

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

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

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

add_action('wpcore_daily_delete_old_orders', 'wpcore_delete_old_orders');

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

  • Проверить в базе данных, что заказы со статусом cancelled и completed, старше 90 дней, удалены.
  • В админке WooCommerce убедиться, что количество заказов уменьшилось.
  • Для проверки запуска Cron можно временно изменить расписание на hourly и посмотреть логи ошибок или добавить запись в лог внутри функции.

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

  • Функция не запускается: убедитесь, что WP-Cron работает (например, посетите сайт, чтобы запустить Cron) или настройте системный cron для wp-cron.php.
  • Заказы не удаляются: проверьте правильность статусов и даты в WP_Query. Статусы должны начинаться с wc-.
  • Удаление не полное: параметр wp_delete_post($order_id, true) отвечает за полное удаление без перемещения в корзину.
  • Большая нагрузка при удалении: используйте posts_per_page для пакетного удаления и избегайте удаления всех заказов за раз.

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

  • Резервное копирование базы перед внедрением автоматического удаления.
  • Используйте транзакции или дополнительные проверки, если база многоуровневая и связи сложные.
  • Выводите логи удаления в отдельный файл для аудита и отладки.
  • Для сайтов с большим количеством заказов стоит запускать удаление поэтапно, например, через WP-CLI или внешние cron-задачи.
  • Если необходимо, интегрируйте проверку прав пользователя, чтобы функция не запускалась случайно в пользовательском режиме.

Сравнение подходов: плагин vs код vs компромиссы

ПодходПлюсыМинусыРекомендации
Плагин (например, WooCommerce Remove Old Orders)Готовое решение, настройки в админке, поддержкаДополнительная нагрузка, возможные конфликты, ограниченная кастомизацияДля простых сайтов или без разработчика
Кастомный код + WP-CronЛёгкость, контроль, отсутствие сторонних зависимостейНужно тестировать, требует знаний, риски при ошибкахДля опытных разработчиков и крупных проектов
Компромисс (код + WP-CLI)Максимальная производительность и контрольТребует SSH доступа и навыков работы с командной строкойДля больших магазинов и продвинутых админов
Как создать автообновляемый кэш в WordPress: практическое руководство
04.11.2025
Оптимальные хуки для удаления и изменения контента в WordPress
07.01.2026
Как создать автоматические виджеты с помощью REST API в WordPress
26.03.2026
Как создать автоматическое отправление email при новом комментарии в WordPress
21.02.2026
WooCommerce: оптимальные настройки для очистки базы от старого кода и данных
28.05.2026