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

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

На больших магазинах WooCommerce количество заказов со временем растет в геометрической прогрессии. Это приводит к разрастанию базы данных и замедлению админки, особенно на страницах с заказами. Если не очищать старые, завершённые или отменённые заказы, производительность падает, а бэкапы и миграции становятся тяжелее.

Проверить количество заказов можно так:

SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Если в таблице wp_posts тысячи заказов со статусами completed, cancelled или refunded старше 1 года — пора подумать об автоматической очистке.

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

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

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

function wpmonitor_delete_old_orders() {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-1 year'));
    
    // Получаем ID заказов со статусом completed, cancelled, refunded старше года
    $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', 'wc-refunded') AND post_date < %s",
        $date_threshold
    ));

    if (empty($order_ids)) {
        return;
    }

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // true - удаляем безвозвратно
    }
}

2. Автоматизируем запуск через WP-Cron

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

// Регистрируем задачу при инициализации
add_action('wpmonitor_delete_old_orders_cron', 'wpmonitor_delete_old_orders');

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

// Для деактивации крон-события
function wpmonitor_deactivate_cron() {
    $timestamp = wp_next_scheduled('wpmonitor_delete_old_orders_cron');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpmonitor_delete_old_orders_cron');
    }
}
register_deactivation_hook(__FILE__, 'wpmonitor_deactivate_cron');

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

После добавления кода подождите до следующего запуска cron (обычно раз в сутки). Затем выполните в базе тот же SQL-запрос, чтобы убедиться, что количество заказов со статусом completed, cancelled, refunded старше года уменьшилось.

Также проверьте админку WooCommerce > Заказы — старые заказы должны исчезнуть.

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

  • Ошибка: Код не удаляет заказы.
    Причина: Неверные статусы заказов. WooCommerce хранит статусы с префиксом wc-, например, wc-completed, а не просто completed. Проверьте, что в SQL и запросах используются правильные статусы.
  • Ошибка: WP-Cron не запускается.
    Причина: На сайте низкий трафик, cron срабатывает только при визите. Для теста запустите cron вручную плагином WP Crontrol или через wp-cli.
  • Ошибка: Заказы удаляются не полностью.
    Причина: Использовался wp_trash_post вместо wp_delete_post($id, true). Второй параметр true гарантирует полное удаление без помещения в корзину.

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

  • Резервное копирование: Перед автоматическим удалением сделайте резервную копию базы данных.
  • Пакетное удаление: Если заказов очень много, удаляйте порциями по 100-200 штук, чтобы избежать таймаутов и нагрузок.
  • Логирование: Добавьте логирование ID удалённых заказов в отдельный файл для аудита.
  • WP-CLI: Для больших магазинов лучше запускать очистку заказов через wp-cli, где можно контролировать процесс и видеть прогресс.

Сравнение способов автоматизации удаления заказов

МетодПлюсыМинусы
WP-Cron + кастомный кодГибкость, бесплатное решение, можно адаптировать под требованияНужен трафик для запуска, может быть медленным при большом объёме
Плагин типа WP Bulk DeleteУдобный интерфейс, можно удалять разные типы контентаДополнительная нагрузка, иногда ограничена функциональность
WP-CLI скриптВысокая скорость, можно запускать вручную или по cron на сервереТребует доступа к серверу, знания командной строки
Как создать собственный виджет WordPress с примерами кода
03.12.2025
WooCommerce: решение проблемы не сохраняются изменения в товарах
03.06.2026
Оптимизация базы данных WordPress для повышения скорости и надежности
25.11.2025
WooCommerce: автоматическое удаление закрытых заказов
04.07.2026
Как установить и настроить PHP Redis для ускорения WordPress
05.01.2026