Удаление продаж WooCommerce по дате и статусу: практическое руководство

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

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

Поэтому оптимальное решение — написать собственный скрипт, использующий WP_Query и стандартные функции WooCommerce для выборки и удаления заказов по конкретным датам и статусам.

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

Шаг 1. Определяем параметры выборки заказов

Для удаления нам нужны два основных параметра:

  • Дата создания заказа — например, удалить все заказы старше 6 месяцев;
  • Статус заказа — например, только отменённые (cancelled) или отменённые и неудачные (failed).

Шаг 2. Создаём WP_Query для выборки заказов

Используем объектный запрос с параметром post_type = 'shop_order' и мета-запросом по статусу заказа. Дату фильтруем через параметр date_query.

$args = [
    'post_type' => 'shop_order',
    'post_status' => ['wc-cancelled', 'wc-failed'], // статусы с префиксом wc-
    'date_query' => [
        [
            'before' => '6 months ago',
            'inclusive' => true,
        ],
    ],
    'posts_per_page' => -1, // получаем все
    'fields' => 'ids', // нужны только ID
];
$query = new WP_Query($args);

Шаг 3. Удаляем заказы программно через wc_delete_order()

После получения ID заказов удаляем их в цикле. Функция wc_delete_order() корректно удаляет заказ и связанные данные.

if (!empty($query->posts)) {
    foreach ($query->posts as $order_id) {
        wc_delete_order($order_id);
    }
}

Шаг 4. Создаём исполняемый PHP-скрипт

Оптимально разместить код в отдельном PHP-файле в корне сайта или в папке темы и запускать через WP-CLI или через браузер (с дополнительной защитой). Пример минимального скрипта для запуска через браузер:

add_action('init', function() {
    if (!is_admin() && isset($_GET['delete_old_orders']) && $_GET['delete_old_orders'] === '1') {
        if (!current_user_can('manage_woocommerce')) {
            wp_die('Нет доступа');
        }

        $args = [
            'post_type' => 'shop_order',
            'post_status' => ['wc-cancelled', 'wc-failed'],
            'date_query' => [
                ['before' => '6 months ago', 'inclusive' => true],
            ],
            'posts_per_page' => -1,
            'fields' => 'ids',
        ];
        $query = new WP_Query($args);

        $count = 0;
        if (!empty($query->posts)) {
            foreach ($query->posts as $order_id) {
                wc_delete_order($order_id);
                $count++;
            }
        }

        wp_die("Удалено заказов: $count");
    }
});

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

Чтобы проверить, что скрипт сработал:

  • Перед запуском сделайте резервную копию базы данных;
  • Запустите скрипт, например, перейдя по адресу https://example.com/?delete_old_orders=1;
  • После выполнения вы увидите сообщение с количеством удалённых заказов;
  • В админке WooCommerce проверьте, что заказы с нужным статусом и датой удалены;
  • Проверьте таблицы wp_posts и wp_postmeta — записи должны отсутствовать.

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

  • Ничего не удаляется: Проверьте правильность статусов — они должны иметь префикс wc-, например, wc-cancelled, а не просто cancelled.
  • Удаляются не те заказы: Проверьте параметр date_query и формат даты. Можно отладить, выведя список ID перед удалением.
  • Ошибка прав доступа: Убедитесь, что пользователь, запускающий скрипт, имеет capability manage_woocommerce.
  • Скрипт занимает много памяти или времени: При очень большом количестве заказов делайте удаление партиями, например по 100 заказов за раз.

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

  • Никогда не запускайте массовое удаление без резервного копирования базы.
  • Ограничьте доступ к скрипту через проверку прав или IP.
  • Для большого объёма данных используйте WP-CLI — он работает быстрее и не ограничен таймаутами PHP.
  • Для удаления партиями используйте параметр 'posts_per_page' => 100 и реализуйте повторный запуск с оффсетом.
  • Используйте транзакции базы или плагин Clearfy для оптимизации и очистки базы после удаления.

Сравнение вариантов удаления заказов

МетодПлюсыМинусы
Ручное удаление в админке WooCommerceПросто, не требует навыковМедленно, неудобно при большом количестве
Плагины массового удаленияУдобный интерфейсМогут быть платными, конфликтовать с другими плагинами
Код на PHP (WP_Query + wc_delete_order)Гибко, быстро, под контролем разработчикаТребует навыков PHP, возможны ошибки при неправильном коде
WP-CLI скриптыСамый быстрый и безопасный методТребует доступа к серверу и знаний командной строки
Как удалить записи WordPress по владельцу: практическое руководство
09.12.2025
Как создать собственный виджет WordPress с использованием классов
13.11.2025
Как автоматически отправлять отзывы после покупки в WordPress
25.02.2026
Автоматическое изменение заголовков постов WordPress по заданным правилам
11.03.2026
Как создать собственный шорткод в WordPress
08.11.2025