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

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

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

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

Для начала важно корректно сформировать WP_Query или WC_Order_Query, чтобы получить заказы по нужным параметрам. Например, заказы со статусом completed старше 30 дней.

$date = date('Y-m-d H:i:s', strtotime('-30 days'));
$args = [
    'limit' => -1,
    'status' => 'completed',
    'date_created' => '<' . $date
];
$orders = wc_get_orders($args);

Данный запрос вернёт все завершённые заказы, созданные раньше 30 дней назад.

Проверка результата выборки

Чтобы убедиться, что выборка корректна, можно вывести количество заказов:

echo 'Найдено заказов: ' . count($orders);

Если значение кажется неожиданным, проверьте правильность формата даты и статус заказа. Статусы должны передаваться без префикса wc- — например, completed, cancelled, failed.

Пошаговое решение: удаление заказов с помощью PHP-кода

Чтобы массово удалить заказы, можно использовать следующий код. Его рекомендуется запускать один раз, например, через functions.php временно или через плагин для пользовательских сниппетов.

function wpstock_delete_old_completed_orders() {
    $date = date('Y-m-d H:i:s', strtotime('-30 days'));
    $args = [
        'limit' => -1,
        'status' => 'completed',
        'date_created' => '<' . $date
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        $order_id = $order->get_id();
        wp_delete_post($order_id, true); // принудительное удаление
    }
    echo 'Удалено заказов: ' . count($orders);
}

// Запуск функции
wpstock_delete_old_completed_orders();

В данном коде:

  • Используется wc_get_orders() для выборки заказов;
  • Удаление происходит через wp_delete_post с параметром true для обхода корзины;
  • Функция выводит количество удалённых заказов.

Как запустить код безопасно

Чтобы не запускать удаление при каждом заходе на сайт, можно обернуть вызов функции в условие, например, проверять GET-параметр:

if (isset($_GET['delete_old_orders']) && current_user_can('manage_woocommerce')) {
    wpstock_delete_old_completed_orders();
}

Тогда вызов https://your-site.com/?delete_old_orders=1 удалит старые заказы, если пользователь имеет права администратора.

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

После выполнения удаления:

  • Зайдите в раздел WooCommerce > Заказы, установите фильтр по статусу и дате;
  • Убедитесь, что заказы старше 30 дней со статусом completed отсутствуют;
  • Проверьте базу данных (таблица wp_posts с типом shop_order), что соответствующие записи удалены;
  • Проверьте логи сайта на наличие ошибок в процессе удаления.

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

  • Неверный формат даты в запросе: используйте формат Y-m-d H:i:s и сравнение с < для выбора по дате создания.
  • Статус заказов указан с префиксом wc-: для wc_get_orders() нужно указывать статус без префикса.
  • Удаление не происходит: проверьте, что функция вызывается, и у пользователя есть права на удаление заказов.
  • Заказы удаляются, но метаданные остаются: wp_delete_post с параметром true удаляет все связанные данные, но если есть нестандартные таблицы, их нужно чистить отдельно.

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

  • Запускайте массовое удаление заказов в периоды низкой нагрузки, чтобы избежать блокировки сайта.
  • Перед удалением сделайте резервную копию базы данных.
  • Для больших магазинов разбивайте удаление на партии по 100-200 заказов, чтобы не превысить лимит памяти и время выполнения скрипта.
  • Используйте WP-CLI для больших выборок: команда wp post delete $(wp post list --post_type='shop_order' --post_status='completed' --date_query_column='post_date' --before='30 days ago' --format=ids) удалит заказы быстро и без нагрузки на сайт.
  • Если часто требуется удалять заказы, рассмотрите написание WP-Cron задачи с таким же кодом, чтобы автоматизировать процесс.

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

МетодПлюсыМинусыКогда использовать
PHP-сниппет с wc_get_orders и wp_delete_postГибкость, можно фильтровать по статусам и датамПри большом количестве заказов может быть медленноСредние и небольшие магазины, точечное удаление
WP-CLIОчень быстрое удаление, без нагрузки на сайтТребует доступа к серверу и навыков командной строкиБольшие магазины, массовая очистка
Плагины массового удаления заказовПростота использования, интерфейсМогут не поддерживать сложные фильтры по датеБыстрое удаление без кода
Как удалить автоматические черновики в WordPress
24.03.2026
Как изменить URL страницы в WordPress без перенаправления
22.02.2026
Удаление товаров WooCommerce со статусом «В очереди» через PHP-код
30.04.2026
Как удалить или отключить XML-RPC в WordPress: практическое руководство
12.01.2026
Как отключить Gutenberg и вернуть классический редактор в WordPress
16.12.2025