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

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

В интернет-магазинах на WooCommerce с течением времени накапливается большое количество заказов в статусах completed (закрытые) и cancelled (отменённые). Это приводит к разрастанию базы данных, замедлению работы административной панели и увеличению времени резервного копирования.

Проверить количество заказов с этими статусами можно через SQL-запрос к базе данных:

SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-cancelled') GROUP BY post_status;

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

Пошаговое решение: автоматизация удаления заказов через WP-Cron

1. Создание функции удаления заказов по статусу и возрасту

Напишем функцию, которая будет удалять заказы со статусом completed и cancelled старше заданного количества дней:

function wc_auto_delete_old_orders() {
    if ( ! current_user_can('manage_woocommerce') ) {
        return;
    }
    global $wpdb;

    $days = 30; // Период в днях, после которого заказы удаляются
    $statuses = ['wc-completed', 'wc-cancelled'];
    
    foreach ($statuses as $status) {
        $query = $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < DATE_SUB(NOW(), INTERVAL %d DAY)",
            $status,
            $days
        );
        $order_ids = $wpdb->get_col($query);

        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // true — безвозвратно
        }
    }
}

2. Регистрация ежедневного задания WP-Cron для автоматизации

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

function wc_schedule_order_deletion() {
    if ( ! wp_next_scheduled('wc_daily_order_cleanup') ) {
        wp_schedule_event(time(), 'daily', 'wc_daily_order_cleanup');
    }
}
add_action('wp', 'wc_schedule_order_deletion');

add_action('wc_daily_order_cleanup', 'wc_auto_delete_old_orders');

3. Очистка планировщика при деактивации

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

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

  • Подождать выполнение wp-cron (обычно запускается при посещении сайта после полуночи).
  • Проверить через phpMyAdmin или любой SQL-клиент наличие заказов со статусом wc-completed и wc-cancelled старше 30 дней — их должно стать меньше или не остаться.
  • В админке WooCommerce проверить количество заказов и убедиться, что старые удалены.

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

1. WP-Cron не запускается автоматически

По умолчанию WP-Cron запускается при посещении сайта. Если трафика мало — задания могут не выполняться вовремя.

Как исправить: настроить системный cron на сервере для вызова WP-Cron, например:

wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

2. Недостаточно прав для удаления заказов

Если функция запускается от имени пользователя без прав manage_woocommerce, удаление не произойдёт.

Решение: запускать код с проверкой прав администратора или использовать прямой вызов через серверные cron задачи.

3. Удаление заказов приводит к потере данных аналитики

Удаление заказов может повлиять на аналитические отчёты WooCommerce.

Совет: делать бэкап перед удалением и убедиться, что отчёты уже сформированы.

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

  • Перед удалением заказов делайте резервные копии базы данных.
  • Устанавливайте период удаления с запасом (например, 30-90 дней), чтобы избежать удаления актуальных заказов.
  • Для больших магазинов стоит реализовать пакетную обработку заказов, чтобы не перегружать сервер.
  • Используйте плагины кэширования и оптимизации базы данных, такие как Clearfy Pro (https://wpshop.ru/plugins/clearfy), для комплексной оптимизации.

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

МетодПреимуществаНедостатки
Кастомный код (WP-Cron)Точный контроль, гибкость, не требует сторонних плагиновТребует навыков разработки, возможны ошибки при реализации
Плагины для очистки заказовПростота установки, готовый интерфейс, поддержкаДополнительная нагрузка, иногда платные, менее гибкие
Как создать динамические шорткоды в WordPress с использованием AJAX
30.01.2026
WooCommerce: решение проблемы не отображения атрибутов вариативных товаров
05.06.2026
Как автоматизировать удаление старого и неиспользуемого кода в WordPress
25.02.2026
WooCommerce: автоматическое удаление закрытых и отменённых заказов для оптимизации базы данных
13.07.2026
Как сделать отложенный запуск cron задач в WordPress
10.02.2026