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

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

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

Как проверить количество отменённых заказов и их возраст

Для оценки ситуации выполните SQL-запрос к базе данных через phpMyAdmin или любой другой инструмент:

SELECT COUNT(*) AS count, MIN(post_date) AS oldest_order FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

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

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

Для автоматизации удаления добавим код в файл functions.php вашей дочерней темы или создадим свой плагин. В примере ниже заказы старше 30 дней будут удаляться при запуске WP-Cron задачи.

function wpmagazin_delete_old_cancelled_orders() {
    global $wpdb;
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

    if (!empty($order_ids)) {
        foreach ($order_ids as $order_id) {
            // Используем WC_Order для корректного удаления
            $order = wc_get_order($order_id);
            if ($order) {
                wp_delete_post($order_id, true); // true - чтобы удалить без перемещения в корзину
            }
        }
    }
}

// Регистрируем событие в WP-Cron, если его ещё нет
if (!wp_next_scheduled('wpmagazin_delete_old_cancelled_orders_cron')) {
    wp_schedule_event(time(), 'daily', 'wpmagazin_delete_old_cancelled_orders_cron');
}

add_action('wpmagazin_delete_old_cancelled_orders_cron', 'wpmagazin_delete_old_cancelled_orders');

Объяснение кода

  • Получаем ID заказов со статусом wc-cancelled, созданных более 30 дней назад.
  • Удаляем их через wp_delete_post с параметром true для полного удаления.
  • Создаем ежедневное событие WP-Cron для автоматического запуска.

Как проверить, что удаление работает

1. В админке WooCommerce перейдите в раздел «Заказы» и отфильтруйте по статусу «Отменён».

2. Запомните количество заказов старше 30 дней.

3. Запустите событие вручную через консоль или добавьте временно вызов функции в functions.php:

add_action('init', function() {
    if (current_user_can('administrator')) {
        wpmagazin_delete_old_cancelled_orders();
    }
});

4. После обновления страницы снова проверьте количество отменённых заказов.

5. Убедитесь, что удалились именно старые заказы, а новые остались.

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

  • Заказы не удаляются: проверьте, активирована ли WP-Cron и не отключен ли он в wp-config.php (DISABLE_WP_CRON должен быть false или отсутствовать).
  • Удаляются лишние заказы: проверьте условие по дате и статусу, возможно ошибка в формате даты или статус указан неверно.
  • Функция вызывается слишком часто: WP-Cron по умолчанию запускается при посещении сайта, можно заменить периодичность на 'weekly' или отключить временные вызовы.

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

  • Резервное копирование базы данных перед применением автоматического удаления — обязательно.
  • Тестируйте код на staging-сайте с копией базы.
  • Если заказов очень много, добавьте пагинацию в выборку и удаляйте партиями, чтобы избежать таймаута PHP.
  • Используйте хук shutdown для запуска удаления после основного процесса, чтобы не влиять на скорость загрузки страниц.
  • Для мониторинга можно логировать удалённые заказы в отдельный файл или отправлять уведомления администратору.

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

МетодПлюсыМинусы
Ручное удаление в админкеПросто, не требует кодаТрудоемко при большом количестве заказов
Плагин (например, WP All Import/Export или специализированные)Графический интерфейс, гибкие фильтрыНагрузка на сайт, требует установки стороннего ПО
Автоматизация через WP-Cron и кодАвтоматически, без сторонних плагинов, гибкая настройкаТребует навыков, возможны ошибки в коде
Как удалить неиспользуемые таксономии в WordPress
22.02.2026
Как создать собственный виджет в WordPress с примером кода
28.12.2025
Как удалить или отключить классический редактор и Gutenberg в WordPress
16.04.2026
Как создать автоматический XML Sitemap в WordPress без плагинов
14.01.2026
Как удалить или отключить комментарии в WordPress на определённых страницах
17.01.2026