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

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

С ростом интернет-магазина база данных WooCommerce может значительно увеличиваться, что приводит к замедлению работы сайта и увеличению времени резервного копирования. Чаще всего в таблице wp_posts накапливаются заказы с статусом completed или cancelled, которые уже не нужны для оперативной работы и аналитики.

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

Как определить, что заказы можно удалять

  • Статус заказа — completed, cancelled, refunded и др.
  • Возраст заказа — например, старше 30 или 90 дней
  • Отсутствие связанных активных подписок или возвратов

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

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

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

function wpmonitor_delete_old_closed_orders() {
    $days = 30; // количество дней хранения заказов
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-completed', 'wc-cancelled', 'wc-refunded'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query($args);

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

2. Регистрация WP-Cron задачи для еженедельного запуска

function wpmonitor_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpmonitor_weekly_order_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpmonitor_weekly_order_cleanup');
    }
}
add_action('wp', 'wpmonitor_schedule_order_cleanup');

add_action('wpmonitor_weekly_order_cleanup', 'wpmonitor_delete_old_closed_orders');

3. Очистка WP-Cron при деактивации плагина или темы

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

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

  • Выполните функцию вручную, вызвав wpmonitor_delete_old_closed_orders() из админки или консоли WP-CLI.
  • Проверьте таблицу wp_posts, убедитесь, что старые заказы удалены.
  • Проверьте логи ошибок и работы WP-Cron (например, с помощью плагина WP Crontrol).
  • Наблюдайте за уменьшением размера базы данных и ускорением резервного копирования.

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

  • Заказы не удаляются: проверьте, что у вас есть права на удаление, и что функция действительно вызывается (добавьте логи или error_log).
  • Удаление заказов с активными подписками: убедитесь, что фильтр статусов и дата выбраны правильно, чтобы не удалить нужные данные.
  • WP-Cron не запускается: если на хостинге отключён WP-Cron, используйте системный cron для имитации вызова wp-cron.php.
  • Потеря данных: всегда делайте бэкап перед удалением данных!

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

  • Удаляйте заказы с помощью wp_delete_post с параметром true для полного удаления, чтобы не оставлять «мусор» в базе.
  • Не запускайте удаление слишком часто — достаточно одного раза в неделю или месяц.
  • Используйте WP-CLI для отладки и запуска задач вручную: wp eval 'wpmonitor_delete_old_closed_orders();'
  • Для крупных магазинов рассмотрите пакетное удаление (например, по 100 заказов за один запуск), чтобы снизить нагрузку на базу.

Таблица сравнения вариантов удаления закрытых заказов

СпособПростотаГибкостьРискиПримечания
Плагин очистки базы (например, WP-Optimize)ВысокаяСредняяМогут удалить лишнееУдобно для неразработчиков
Код с WP-Cron (как в статье)СредняяВысокаяТребует тестированияКонтроль и настройка под проект
Ручное удаление через админкуНизкаяНизкаяТрудоёмко при большом объёмеПодходит для разовых очищений
WooCommerce: решение проблемы не сохраняются изменения в товарах
03.06.2026
WooCommerce: как автоматически очищать корзину после успешной оплаты
20.05.2026
Как предотвратить дублирование заказов в WooCommerce
01.05.2026
Как настроить отправку email через SMTP в WordPress: практическое руководство
27.12.2025
Как создать собственный виджет WordPress с примерами кода
03.12.2025