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

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

В WooCommerce с течением времени накапливаются заказы, которые уже не нужны, например, отменённые или просроченные. Это может замедлять работу базы данных и усложнять отчётность. Удалять заказы вручную неудобно и рискованно, особенно при большом объёме. Требуется автоматизация удаления заказов по заданным критериям — статусу и дате создания.

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

1. Подключение к WordPress и WooCommerce

Для работы с заказами используйте стандартные классы WooCommerce. Убедитесь, что код выполняется в контексте WordPress, например, в functions.php вашей темы или в отдельном плагине.

2. Создание функции для выборки и удаления заказов

Основная идея — найти все заказы с нужным статусом, созданные до определённой даты, и удалить их с помощью WooCommerce API.

function wpdeveloper_delete_old_woocommerce_orders( $status = 'cancelled', $before_date = '2023-01-01' ) {
    $args = [
        'limit' => -1, // без ограничения
        'status' => $status,
        'date_created' => '<' . $before_date,
        'return' => 'ids', // возвращаем только ID заказов
    ];

    $orders = wc_get_orders( $args );

    if ( empty( $orders ) ) {
        return 'Заказы не найдены для удаления.';
    }

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            wp_delete_post( $order_id, true ); // true — для полного удаления
        }
    }

    return count( $orders ) . ' заказов удалено.';
}

3. Вызов функции с параметрами

Вы можете вызвать функцию, например, так:

add_action( 'init', function() {
    if ( current_user_can( 'manage_woocommerce' ) && isset( $_GET['delete_old_orders'] ) ) {
        echo wpdeveloper_delete_old_woocommerce_orders( 'cancelled', '2023-01-01' );
        exit;
    }
});

После этого перейдите по URL https://ваш-сайт.ru/?delete_old_orders=1 под админом — заказы будут удалены.

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

  • В админке WooCommerce перейдите в раздел Заказы. Проверьте, что заказы с указанным статусом и датой отсутствуют.
  • Используйте запрос в базе данных MySQL, например:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < '2023-01-01'; — результат должен быть ноль или меньше, чем до удаления.
  • Отслеживайте логи ошибок и доступности сайта на предмет проблем при выполнении кода.

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

  • Неверный статус заказа: WooCommerce использует префикс wc- для статусов, например wc-cancelled. В wc_get_orders достаточно указать без префикса, но будьте внимательны.
  • Удаление не происходит: Проверьте, что функция вызывается и выполняется с правами администратора.
  • Заказы не удаляются полностью: По умолчанию wp_delete_post с флагом true удалит заказ и связанные метаданные, если флаг false, заказ попадёт в корзину.
  • Проблемы с производительностью при большом количестве заказов: Делайте удаление партиями, не все сразу. Добавьте лимит и запускайте по cron.

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

  • Обязательно проверяйте права пользователя перед запуском удаления.
  • Используйте WP-Cron для периодической очистки:
add_action( 'wpdeveloper_scheduled_order_cleanup', function() {
    wpdeveloper_delete_old_woocommerce_orders( 'cancelled', date( 'Y-m-d', strtotime( '-30 days' ) ) );
});

if ( ! wp_next_scheduled( 'wpdeveloper_scheduled_order_cleanup' ) ) {
    wp_schedule_event( time(), 'daily', 'wpdeveloper_scheduled_order_cleanup' );
}
  • Перед массовым удалением создавайте резервные копии базы.
  • Для крупных магазинов рассмотрите удаление заказов через SQL-запросы, но с осторожностью и бэкапом.

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

МетодПлюсыМинусыПример кода
Использование wc_get_orders + wp_delete_post Безопасно, учитывает все связные данные WooCommerce Медленнее при большом количестве заказов Пример выше
Прямой SQL запрос для удаления Очень быстро Риск повреждения данных, требует глубокого понимания структуры БД Не рекомендуется без опыта
Использование плагинов очистки Удобно, готовые UI Может не учитывать все детали, нагрузка на сайт Например, WP Bulk Delete
Автоматическое изменение заголовков постов WordPress по заданным правилам
11.03.2026
Как создать автоматическую регистрацию пользователей в WordPress с помощью WPGPT
10.02.2026
Как создать собственный виджет WordPress с использованием классов
13.11.2025
Как создать адаптивные блоки в WordPress Gutenberg
02.12.2025
Как отключить AJAX в WooCommerce на страницах корзины и оформления заказа
30.05.2026