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

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

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

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

1. Создание пользовательской функции в functions.php

Добавим функцию, которая будет удалять заказы с заданным статусом из базы. В WooCommerce заказы — это тип записи shop_order, а статус хранится как post_status с префиксом wc-.

function wpelement_delete_orders_by_status( $status = 'cancelled' ) {
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-' . $status,
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts( $args );

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true - удалить навсегда
    }
}

2. Запуск функции по расписанию с помощью WP-Cron

Чтобы удалять заказы регулярно, добавим задачу в планировщик WP-Cron, которая будет запускать функцию, например, раз в сутки.

function wpelement_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpelement_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpelement_daily_order_cleanup' );
    }
}
add_action( 'wp', 'wpelement_schedule_order_cleanup' );

add_action( 'wpelement_daily_order_cleanup', function() {
    wpelement_delete_orders_by_status( 'cancelled' );
    wpelement_delete_orders_by_status( 'failed' );
});

Как проверить, что удаление сработало

1. В админке WooCommerce перейдите в раздел Заказы и отфильтруйте по статусам Отменён и Провален. После выполнения функции количество заказов с этими статусами должно быть 0.

2. Можно также проверить напрямую в базе данных, выполнив SQL-запрос:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed');

Если результат 0 — удаление прошло успешно.

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

  • Функция не запускается по расписанию: Возможно, WP-Cron отключён на сервере или низкая посещаемость сайта. Проверьте наличие задачи командой wp cron event list через WP-CLI или используйте плагин WP Crontrol.
  • Заказы не удаляются, но функция вызывается: Проверьте права пользователя и убедитесь, что функция вызывается с правами администратора или с нужными capabilities.
  • Удаление не навсегда: Убедитесь, что в функции wp_delete_post второй параметр установлен в true для полного удаления, иначе заказы попадут в корзину.
  • Удаление затрагивает нужные заказы: Перед массовым удалением сделайте резервную копию базы и протестируйте функцию на тестовом сайте.

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

  • Перед автоматическим удалением создайте резервную копию базы данных. Например, используйте плагин Clearfy Pro для автоматизации бэкапов и очистки.
  • Не запускайте удаление слишком часто — достаточно одного раза в сутки, чтобы не перегружать сервер.
  • Если количество заказов с нужным статусом очень большое, разбейте удаление на части, например, по 100 записей за раз, чтобы избежать превышения лимита памяти или времени выполнения.
  • Для отладки используйте запись логов удаления с помощью error_log или собственного файла логов.

Чек-лист для внедрения автоматического удаления заказов по статусу

  • Определить статусы заказов для удаления (например, cancelled, failed)
  • Добавить функцию удаления заказов по статусу в functions.php или кастомный плагин
  • Настроить WP-Cron для регулярного запуска функции
  • Проверить права пользователей и корректность работы функции вручную
  • Протестировать на тестовом сайте с резервной копией базы
  • Мониторить результаты: количество заказов в админке и в базе
  • Оптимизировать выполнение для больших объёмов данных (пакетная обработка)
  • Настроить уведомления или логи для контроля процесса

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

СпособПлюсыМинусыКогда использовать
Плагин очистки заказовПростота установки, готовый функционалМожет быть избыточным, нагрузка на сайтДля нетехнических пользователей
Кастомный код + WP-CronГибкость, контроль, оптимизация под проектТребует навыков, нужно тестироватьДля разработчиков и крупных проектов
Ручное удаление через админкуПростота, отсутствие кодаТрудозатратно, не подходит для большого объёмаРедкие случаи, малое количество заказов
Как автоматизировать удаление старого контента в WordPress по дате публикации
11.04.2026
Как добавить автозаполнение форм в WordPress без плагинов
23.03.2026
Оптимальные названия для постов и страниц в WordPress
23.01.2026
Использование WP REST API для автоматизации задач в WordPress
16.03.2026
Как автоматизировать удаление старых комментариев в WordPress
30.03.2026