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

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

В крупных интернет-магазинах WooCommerce количество заказов быстро растет, и в админке накапливаются заказы с устаревшими статусами — например, отменённые, ожидающие оплаты или проваленные платежи. Это увеличивает нагрузку на базу данных и замедляет работу админки. Ручное удаление заказов неудобно и требует времени.

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

Как настроить автоматическое удаление заказов WooCommerce по статусу

Выбор статусов для удаления

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

  • pending — ожидает оплаты;
  • failed — неудачный платеж;
  • cancelled — отменён;
  • refunded — возвращён;
  • completed — выполнен и т.д.

Чаще всего для удаления подходят cancelled, failed и pending старше определённого срока.

Пошаговое решение: добавляем cron-задачу для удаления

1. Добавляем функцию удаления заказов с нужными статусами и датой старше N дней.

function wporders_delete_old_orders() {
    $statuses_to_delete = array('cancelled', 'failed', 'pending');
    $days_old = 30; // количество дней для удаления
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array_map(function($s) { return 'wc-' . $s; }, $statuses_to_delete),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

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

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

2. Регистрируем cron-событие при инициализации WordPress (лучше в плагине или functions.php темы):

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

add_action('wporders_daily_order_cleanup', 'wporders_delete_old_orders');

3. Если нужно, можно изменить период с 'daily' на 'weekly' или кастомный интервал, зарегистрировав его через cron_schedules.

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

  • Создайте тестовые заказы с нужными статусами и датой старше 30 дней (можно вручную в базе или через код).
  • Запустите вручную функцию wporders_delete_old_orders() из админки или через WP-CLI: wp eval 'wporders_delete_old_orders();'.
  • Проверьте, что заказы удалились из базы (через админку WooCommerce или SQL-запрос SELECT ID, post_status FROM wp_posts WHERE post_type = 'shop_order' AND ID IN (...)).
  • Дождитесь запуска cron-задания и убедитесь, что заказы удаляются автоматически.

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

  • Заказы не удаляются: проверьте, что cron-событие зарегистрировано (wp_next_scheduled) и что функция удаления вызывается.
  • Удаляются не те заказы: проверьте правильность статусов — в WooCommerce статусы имеют префикс wc-.
  • Ошибка при удалении из-за прав: убедитесь, что код выполняется с достаточными правами, например, в контексте администратора.
  • Удаление не происходит автоматически: проверьте работу WP-Cron, возможно, надо настроить системный cron или использовать плагин WP Crontrol для отладки.

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

  • Удаляйте заказы с осторожностью — лучше делать резервное копирование базы перед автоматическим удалением.
  • Если заказов много, разбивайте удаление на партии, чтобы избежать превышения лимитов памяти и таймаута. Например, добавьте параметр posts_per_page = 100 и реализуйте пагинацию.
  • Можно добавить логирование удалённых заказов в отдельный файл или таблицу для аудита.
  • Используйте WP-Cron вместе с системным cron для более надёжного запуска задач.

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

МетодПлюсыМинусыПример
Ручное удаление через админкуПросто, не требует кодаМного времени, неудобно при большом объёмеWooCommerce > Заказы > Выбрать > Удалить
Автоматический WP-Cron с кастомным кодомАвтоматизация, гибкостьТребует программирования, настройка cronКод из статьи
Плагины очистки базыГотовые решения, интерфейсМогут удалять лишнее, нагрузка на сайтWP-Optimize, Advanced Database Cleaner
Добавление поля комментария к заказу в WooCommerce
20.12.2025
Оптимизация заказов в WordPress WooCommerce: практические советы и примеры кода
01.11.2025
Как создать собственный тип записей в WordPress: практическое руководство
04.12.2025
Проверка и валидация данных в форме оформления заказа WooCommerce
21.02.2026
Как добавить логирование ошибок при создании и обновлении заказов WooCommerce
04.06.2026