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

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

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

Основная задача — удалить заказы с определённым статусом (например, cancelled или failed) и которые старше заданной даты, чтобы не затронуть текущие активные заказы.

Как получить список отменённых заказов по дате и статусу

Для начала полезно вывести список заказов, которые попадут под удаление. Это поможет избежать удаления важных записей.

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

if($query->have_posts()) {
    echo 'Найдено заказов для удаления: ' . count($query->posts) . "\n";
    foreach($query->posts as $order_id) {
        echo 'Заказ ID: ' . $order_id . "\n";
    }
} else {
    echo 'Заказы не найдены.';
}
wp_reset_postdata();

Пошаговое решение: удаление заказов через WP-CLI или PHP-скрипт

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

Для удаления заказов безопаснее использовать функционал WooCommerce, чтобы очистить все связанные метаданные и записи.

function delete_old_cancelled_orders($date_before = '2023-01-01') {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-failed'],
        'date_query'     => [
            [
                'before' => $date_before,
                'inclusive' => true,
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $query = new WP_Query($args);
    if (!$query->have_posts()) {
        return 0;
    }

    foreach ($query->posts as $order_id) {
        wp_delete_post($order_id, true); // true — полное удаление без корзины
    }
    wp_reset_postdata();

    return count($query->posts);
}

2. Запускаем удаление

Этот код можно временно добавить в файл темы functions.php или создать отдельный плагин. Затем вызвать функцию, например, через admin-ajax или WP-CLI.

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['delete_old_orders'])) {
        $deleted = delete_old_cancelled_orders('2023-01-01');
        echo 'Удалено заказов: ' . $deleted;
        exit;
    }
});

После добавления откройте URL https://site.ru/wp-admin/?delete_old_orders=1 под админом.

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

  • Проверьте в админке WooCommerce — отменённые заказы до даты должны исчезнуть.
  • Запустите запрос из первого шага — список должен быть пустым.
  • Проверьте размер базы данных, если есть доступ, — должна уменьшиться таблица wp_posts и wp_postmeta.

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

  • Удаление не происходит: проверьте права пользователя и корректность вызова функции.
  • Некорректный статус заказа: WooCommerce использует префикс wc- для статусов, например wc-cancelled. Без префикса запрос не найдёт заказы.
  • Удаляются нужные заказы: всегда сначала выводите список удаляемых заказов, чтобы проверить дату и статус.
  • Замедление при большом количестве заказов: лучше удалять партиями по 100-200 заказов, чтобы избежать таймаутов.

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

  • Используйте WP-CLI для массового удаления заказов — это быстрее и безопаснее, чем через сайт.
  • Создайте резервную копию базы перед удалением.
  • Ограничьте права на запуск удаления только администраторам и менеджерам WooCommerce.
  • Автоматизируйте удаление через WP-Cron с небольшим лимитом заказов за раз.

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

МетодПлюсыМинусы
Через админку WooCommerceПросто, не требует кодаТрудоёмко при большом количестве
PHP-функция (как выше)Автоматизация, гибкостьРиск ошибки, нужно тестировать
WP-CLI командаБыстро, безопасно, удобно для больших базТребуется SSH-доступ и знания командной строки
Автоматическое удаление неиспользуемых категорий в WordPress
03.04.2026
Как установить Redis кэш в WordPress и настроить его правильно
03.02.2026
Как удалить записи WordPress по владельцу: практическое руководство
09.12.2025
Как избежать проблем с совместимостью плагинов WooCommerce
26.04.2026
Как создать адаптивные блоки в WordPress Gutenberg
02.12.2025