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

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

В WooCommerce с течением времени накапливается большое количество заказов, часть из которых может быть тестовыми, неактивными или устаревшими. Массовое удаление таких заказов вручную через админку неудобно и занимает много времени. Автоматизация процесса удаления заказов по определённым критериям (например, статусу "отменён" и дате создания старше 6 месяцев) помогает поддерживать базу в чистоте и улучшает производительность сайта.

Как определить заказы для удаления: выбор критериев

Для удаления можно использовать комбинацию следующих параметров:

  • Статус заказа: например, "cancelled", "failed", "refunded" и другие.
  • Дата создания заказа: удалять заказы старше определённого периода, например, 6 месяцев или 1 года.
  • Дополнительные условия: по email покупателя, меткам, способу оплаты и т.д.

В этой статье рассмотрим простой пример удаления заказов со статусом "cancelled" старше 6 месяцев.

Пошаговое решение: код для удаления заказов WooCommerce по статусу и дате

1. Создаём WP-CLI команду для безопасного запуска

Лучший способ массово удалять заказы — использовать WP-CLI. Это позволит избежать таймаутов и ошибок памяти при большом количестве заказов.

if ( defined('WP_CLI') && WP_CLI ) {
    WP_CLI::add_command('wc delete_old_cancelled_orders', function() {
        $date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));

        $args = [
            'post_type' => 'shop_order',
            'post_status' => 'wc-cancelled',
            'date_query' => [
                [
                    'column' => 'post_date',
                    'before' => $date_threshold,
                ],
            ],
            'posts_per_page' => -1,
            'fields' => 'ids',
        ];

        $orders = get_posts($args);
        $count = 0;

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

        WP_CLI::success("Удалено {$count} заказов со статусом 'cancelled' старше 6 месяцев.");
    });
}

2. Запуск команды

В терминале в корне сайта запускаем:

wp wc delete_old_cancelled_orders

Если WP-CLI настроен правильно, команда удалит все подходящие заказы и выведет отчёт.

3. Альтернатива: удаление через PHP-скрипт с ограничением по пакетам

Если WP-CLI недоступен, можно использовать PHP-функцию с использованием wp_schedule_single_event для пакетной обработки, чтобы избежать превышения лимитов.

function delete_old_cancelled_orders_batch() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));

    $args = [
        'post_type' => 'shop_order',
        'post_status' => 'wc-cancelled',
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'posts_per_page' => 20,
        'fields' => 'ids',
    ];

    $orders = get_posts($args);

    if (empty($orders)) {
        return; // Нет заказов для удаления
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }

    // Запланировать следующий запуск через 1 минуту
    wp_schedule_single_event(time() + 60, 'delete_old_cancelled_orders_batch_hook');
}

add_action('delete_old_cancelled_orders_batch_hook', 'delete_old_cancelled_orders_batch');

// Запустить первый раз вручную
// delete_old_cancelled_orders_batch();

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

  • В админке WooCommerce перейдите в раздел "Заказы" и примените фильтр по статусу "отменён".
  • Выберите период старше 6 месяцев (или используйте SQL-запрос к базе для проверки):
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 6 MONTH);

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

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

  • Заказы не удаляются: Проверьте, что статус заказа указан правильно — WooCommerce использует префикс wc- в статусах, например, wc-cancelled.
  • Скрипт зависает или вызывает ошибку памяти: используйте пакетную обработку, ограничивая количество удаляемых заказов за раз.
  • WP-CLI команда не доступна: убедитесь, что WP-CLI установлен и доступен в окружении, где выполняется скрипт.
  • Заказы восстанавливаются после удаления: используйте wp_delete_post($order_id, true), где второй параметр означает безвозвратное удаление.

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

  • Создайте резервную копию базы данных перед массовым удалением заказов.
  • Выполняйте массовые операции в ночное время с низкой нагрузкой на сервер.
  • Для больших магазинов используйте WP-CLI или пакетную обработку, чтобы избежать тайм-аутов.
  • Если хотите автоматизировать удаление, настройте cron-задачу, вызывающую WP-CLI команду или wp_schedule_event с аналогичным кодом.

Сравнение подходов удаления заказов WooCommerce

МетодПреимуществаНедостатки
WP-CLI командаБыстро, безопасно, подходит для больших объёмовТребует доступа к серверу и установки WP-CLI
PHP скрипт с пакетной обработкойМожно запускать из админки или через cronСложнее в настройке, возможны тайм-ауты при неправильной настройке
Ручное удаление через админкуПросто и без кодаНеэффективно для большого количества заказов
WooCommerce: правильное удаление вариантов товаров через код
13.05.2026
Как добавить CSS класс к постам в WordPress по условию
10.04.2026
Как использовать хук woocommerce_before_calculate_totals для изменения цены товаров в WooCommerce
25.04.2026
Как создать динамические таблицы в WordPress с помощью AJAX
07.04.2026
Как удалить и заблокировать спам в комментариях WordPress
20.03.2026