Как программно удалить заказы со статусом «Отменён» в WooCommerce

Диагностика проблемы: зачем удалять заказы со статусом «Отменён»

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

Как получить и удалить заказы со статусом «Отменён» через WP_Query и WC_Order

Пошаговое решение с примером кода для functions.php или отдельного плагина

Ниже пример функции, которая получает все заказы со статусом cancelled и удаляет их программно через API WooCommerce.

function wptips_delete_cancelled_orders() {
    // Запрос всех заказов со статусом 'cancelled'
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $cancelled_orders = get_posts($args);

    if (empty($cancelled_orders)) {
        error_log('Нет заказов со статусом cancelled для удаления.');
        return;
    }

    foreach ($cancelled_orders as $order_id) {
        // Получаем объект заказа
        $order = wc_get_order($order_id);
        if ($order) {
            // Удаляем заказ навсегда (без корзины)
            wp_delete_post($order_id, true);
            error_log('Удалён заказ ID: ' . $order_id);
        }
    }
}

Чтобы выполнить удаление, вызовите эту функцию один раз, например через add_action('admin_init', 'wptips_delete_cancelled_orders'); и после первого срабатывания удалите этот хук, чтобы не запускать повторно.

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

  • Перейдите в WooCommerce → Заказы и проверьте, что заказы со статусом «Отменён» отсутствуют.
  • В админке WordPress проверьте логи ошибок (error_log), чтобы увидеть сообщения об удалённых заказах.
  • В базе данных в таблице wp_posts убедитесь, что записи с post_type = 'shop_order' и post_status = 'wc-cancelled' отсутствуют.

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

  • Заказы не удаляются: проверьте, что функция вызывается; временно добавьте error_log внутри функции для отладки.
  • Удаляются не те заказы: убедитесь, что фильтр 'post_status' => 'wc-cancelled' написан правильно, статус должен быть с префиксом wc-.
  • Удаление происходит повторно: после первого запуска удалите или закомментируйте хук, чтобы избежать повторного удаления и нагрузки.
  • Ошибки доступа: убедитесь, что ваш пользователь имеет права администратора и функция запускается в админке.

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

  • Для большого количества заказов разбивайте удаление на батчи, чтобы избежать таймаута PHP. Например, обрабатывать по 100 заказов за раз, используя offset в запросе.
  • Перед удалением сделайте резервную копию базы данных, особенно если магазин на рабочем сервере.
  • Используйте wp_delete_post($order_id, true), чтобы удалить заказ полностью с метаданными и не оставлять «мусор» в базе.
  • Для регулярного удаления отменённых заказов можно настроить WP-Cron с этим кодом, но будьте осторожны с нагрузкой.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, без кодаДолго при большом количестве, риск ошибок
Удаление через SQL-запросыБыстро, массовоРиск повредить данные, требует знаний
Программное удаление через WC API (код)Безопасно, учитывает зависимости, можно автоматизироватьТребует разработки и тестирования
Использование WP-Cron для автоматического удаления старых записей в WordPress
24.04.2026
Как отладить и использовать hooks в WordPress: практическое руководство
30.11.2025
Как создать автозаказ в WooCommerce с помощью кода
20.03.2026
Как сделать автоматический откат обновлений в WordPress при ошибках
03.04.2026
Как использовать динамический CSS в WordPress для разных устройств
28.02.2026