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

Почему важно удалять закрытые заказы в WooCommerce

В WooCommerce с течением времени накапливаются заказы со статусом completed или cancelled. Если магазин работает давно и объем заказов большой, база данных разрастается, что замедляет запросы и увеличивает размер резервных копий. Автоматическое удаление закрытых заказов помогает поддерживать базу данных в оптимальном состоянии, снижать нагрузку и ускорять работу сайта.

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

  • Проверьте размер таблицы wp_posts и связанных таблиц (wp_postmeta, wp_woocommerce_order_items, wp_woocommerce_order_itemmeta) через phpMyAdmin или консоль MySQL.
  • Выявите количество заказов со статусами completed, cancelled и другими закрытыми.
  • Отслеживайте замедления в админке WooCommerce при открытии списка заказов.
SELECT post_status, COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

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

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

1. Создание WP-Cron задачи для удаления заказов

Добавим в файл functions.php вашей темы или в кастомный плагин код, который будет запускать функцию очистки регулярно.

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

add_action( 'wpengine_delete_old_closed_orders', 'wpengine_delete_old_closed_orders_callback' );

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

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

    if ( ! empty( $order_ids ) ) {
        foreach ( $order_ids as $order_id ) {
            wp_delete_post( $order_id, true ); // true — удаление без возможности восстановления
        }
    }
}

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

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

add_action('admin_init', function() {
    if ( current_user_can('manage_options') && isset($_GET['delete_old_orders_test']) ) {
        wpengine_delete_old_closed_orders_callback();
        echo 'Старые закрытые заказы удалены';
        exit;
    }
});

Перейдите в админку с параметром ?delete_old_orders_test=1 для теста.

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

  • До и после запуска функции проверьте количество заказов с помощью SQL-запроса, приведенного в разделе диагностики.
  • Проверьте таблицы базы данных на уменьшение объема записей.
  • Убедитесь, что удаленные заказы не отображаются в админке WooCommerce.
  • Проверьте, что работа сайта и админки не замедлилась и не возникло ошибок.

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

  • Отсутствие прав доступа при удалении заказов. Убедитесь, что функция вызывается с правильными правами и в нужном контексте (WP-Cron или админка).
  • Удаление не тех заказов. Проверьте правильность условий в SQL-запросе, особенно статус заказов и дату.
  • Задание WP-Cron не запускается. Проверьте, активен ли WP-Cron на сайте и не блокируется ли вызов wp-cron.php сервером.
  • Удаление заказов приводит к потере нужных данных. Настройте правильный период хранения заказов, например, 30-60 дней, чтобы сохранить историю.

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

  • Всегда делайте резервные копии базы данных перед запуском автоматического удаления.
  • Используйте wp_delete_post( $order_id, true ) для полного удаления, включая метаданные, чтобы не оставлять мусор в базе.
  • Если заказов очень много, разбивайте удаление на части, чтобы избежать превышения лимита времени выполнения PHP. Например, удаляйте по 100 заказов за один запуск.
  • Для улучшения производительности можно отключить триггеры и индексы в базе, но это требует глубоких знаний и доступа к серверу.
  • Проверяйте логи сервера и WordPress на предмет ошибок после внедрения кода.

Сравнение подходов к удалению закрытых заказов

МетодПлюсыМинусы
Ручное удаление через админкуПростота, контрольТрудозатратно, риск пропуска
WP-Cron с кастомным кодомАвтоматизация, гибкость, настройка периодаНеобходим опыт, возможны ошибки при неправильном коде
Плагины для очистки базыУдобство, дополнительные функции (оптимизация, очистка кэша)Зависимость от сторонних разработчиков, нагрузка на сайт
Автоматизация обновлений тем и пингов в WordPress на WPengine
08.03.2026
WooCommerce: автоматическое обновление остатков и цен товаров с поставщиками
13.06.2026
Как сделать отложенный запуск cron задач в WordPress
10.02.2026
WooCommerce: отладка и решение проблем с неотображением вариативных атрибутов
19.05.2026
Автоматизация обновлений WordPress с WPengine: настройка и примеры
14.12.2025