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

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

С течением времени база заказов WooCommerce может значительно разрастаться, особенно если магазин обрабатывает большое количество транзакций. Это влияет на производительность сайта, увеличивает размер базы данных и усложняет её резервное копирование. Удаление завершённых и старых заказов помогает поддерживать базу в чистоте и ускоряет работу сайта.

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

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

  • Откройте phpMyAdmin или другой инструмент для работы с базой данных.
  • Выполните запрос для подсчёта заказов со статусом completed:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed';

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

Пошаговое решение: автоматизация удаления завершённых заказов старше 30 дней

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

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

function wpstock_delete_old_completed_orders() {
    global $wpdb;
    $date = date('Y-m-d H:i:s', strtotime('-30 days'));
    // Получаем ID заказов со статусом completed старше 30 дней
    $orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < %s",
        $date
    ));

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

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

2. Запускаем функцию по расписанию с помощью WP-Cron

Добавим планировщик задач (cron) для еженедельного запуска удаления:

// Регистрируем событие при активации темы/плагина
function wpstock_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpstock_weekly_order_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpstock_weekly_order_cleanup');
    }
}
add_action('wp', 'wpstock_schedule_order_cleanup');

// Привязываем функцию удаления к событию cron
add_action('wpstock_weekly_order_cleanup', 'wpstock_delete_old_completed_orders');

// Отменяем событие при деактивации темы/плагина
function wpstock_deactivate_order_cleanup() {
    $timestamp = wp_next_scheduled('wpstock_weekly_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpstock_weekly_order_cleanup');
    }
}

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

  • Через админку WooCommerce перейдите в раздел Заказы и отсортируйте по статусу "Завершён".
  • Проверьте, что заказы старше 30 дней отсутствуют.
  • Для теста можно вручную запустить функцию из консоли WP-CLI:
wp eval 'wpstock_delete_old_completed_orders();'
  • Если количество заказов уменьшилось, значит удаление работает корректно.
  • Частые ошибки и как их исправить

    • Удаление не происходит: убедитесь, что хук планировщика активирован, проверьте вызов wp_schedule_event.
    • Заказы не удаляются полностью: используйте wp_delete_post($order_id, true); с параметром true для принудительного удаления.
    • Ошибка в SQL-запросе: используйте подготовленные запросы $wpdb->prepare для безопасности и корректности.
    • Планировщик не срабатывает: на локальных серверах WP-Cron может не работать без посещений сайта — можно настроить системный cron.

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

    • Перед удалением создайте резервную копию базы данных.
    • Для больших магазинов выполняйте удаление партиями (например, по 100 заказов за раз), чтобы избежать таймаутов.
    • Можно использовать WP-CLI для пакетной очистки, если доступ к SSH есть.
    • Ограничьте права пользователя, под которым запускается скрипт, чтобы избежать случайного удаления других данных.

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

    МетодПлюсыМинусыПример
    Ручное удаление через админкуПросто и понятноМного времени при большом объёме заказовWooCommerce → Заказы → Фильтр → Удалить
    Автоматическое через WP-Cron + PHPАвтоматизация, не требует вмешательстваНужна правильная настройка cronКод в functions.php (пример выше)
    Удаление через WP-CLIОчень быстро, можно запускать вручнуюТребуется SSH-доступwp post delete $(wp post list --post_type=shop_order --post_status=wc-completed --field=ID --date_query_column=post_date --before='30 days ago')
    Как добавить собственные настройки в админ-панель WordPress
    02.12.2025
    Как создать динамический фильтр по таксономиям в WordPress с примерами кода
    19.01.2026
    Как создать автоматический импорт продуктов WooCommerce из CSV файла
    12.04.2026
    Как отключить Gutenberg и вернуть классический редактор в WordPress
    16.12.2025
    Как создать собственный шорткод в WordPress: пошаговое руководство
    17.11.2025