Как автоматически очищать отменённые и завершённые заказы в WooCommerce

Проблема: накопление отменённых и завершённых заказов в WooCommerce

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

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

Чтобы оценить, насколько проблема актуальна, выполните следующие шаги:

  • Войдите в админ-панель WordPress, откройте раздел WooCommerce → Заказы.
  • Отфильтруйте заказы по статусам cancelled и completed.
  • Оцените количество заказов с этими статусами. Если их тысячи и они старше нескольких месяцев, база требует очистки.
  • Проверьте размер таблиц wp_posts и wp_postmeta в базе данных, связанных с заказами. Большой объем данных замедляет запросы.

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

Ниже приведён пример кода, который можно добавить в файл functions.php вашей темы или в отдельный кастомный плагин. Он удалит все отменённые и завершённые заказы, которым больше 30 дней, при запуске WordPress Cron (WP-Cron).

function wp24_delete_old_woocommerce_orders() {
    if ( ! class_exists('WooCommerce') ) {
        return; // WooCommerce не активен
    }

    global $wpdb;
    $statuses = array('cancelled', 'completed');
    $days = 30; // удалять заказы старше 30 дней
    $date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ( $statuses as $status ) {
        // Получаем ID заказов по статусу и дате
        $order_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            'wc-' . $status, $date_limit
        ));

        if ( ! empty($order_ids) ) {
            foreach ( $order_ids as $order_id ) {
                // Удаляем заказ и связанные метаданные
                wp_delete_post($order_id, true);
            }
        }
    }
}

// Запускаем функцию раз в сутки
add_action('wp_scheduled_delete_old_orders', 'wp24_delete_old_woocommerce_orders');

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

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

  • Функция wp24_delete_old_woocommerce_orders проверяет наличие WooCommerce.
  • Выбирает заказы со статусами cancelled и completed, старше 30 дней.
  • Удаляет заказы с помощью wp_delete_post с параметром true для полного удаления.
  • Функция запускается ежедневно через WP-Cron.

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

  • Подождите следующий запуск WP-Cron (или вызовите вручную через плагин WP Crontrol).
  • В админке WooCommerce проверьте количество заказов со статусом cancelled и completed — должны исчезнуть те, что старше 30 дней.
  • Проверьте размер таблиц wp_posts и wp_postmeta — они должны уменьшиться.
  • Можно временно добавить логирование для отладки, например, error_log('Deleted order ID: ' . $order_id); внутри цикла.

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

  • Код не запускается: проверьте, активен ли WP-Cron на сайте. Для ручного запуска используйте плагин WP Crontrol.
  • Заказы не удаляются: убедитесь, что статусы заказов указаны правильно с префиксом wc-, например, wc-cancelled.
  • Удаляются не те заказы: проверьте условие выборки даты, возможно, часовой пояс сайта влияет на вычисления.
  • Проблемы с производительностью при удалении: если заказов много, лучше делать удаление пакетами, добавив лимит и повторный запуск через WP-Cron.

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

  • Перед удалением заказов создайте резервную копию базы данных.
  • Для больших магазинов делайте удаление партиями, например, по 100 заказов за раз.
  • Отключайте WP-Cron на сервере и используйте системный cron для стабильности.
  • Добавьте проверку прав пользователя, если создаёте интерфейс для запуска очистки вручную.

Сравнение вариантов очистки заказов WooCommerce

МетодПлюсыМинусы
Ручное удаление в админкеПростота, не требует кодаТрудоемко при большом количестве заказов
Плагин для очистки заказовУдобство, расширенные настройкиДополнительная нагрузка, возможны конфликты
Код в functions.php (автоматизация)Контроль, отсутствие сторонних плагиновТребует навыков, возможны ошибки в коде
Как создать собственный REST API в WordPress
10.11.2025
Как настроить отложенный запуск задач в WordPress без использования WP-Cron
05.02.2026
Как удалить заблокированные или проблемные медиафайлы в WordPress
31.05.2026
Как создать собственный виджет WordPress с примером кода
02.12.2025
Как создать автоматическую резервную копию WordPress: лучшие практики и примеры кода
17.11.2025