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

Почему важно удалять незавершённые заказы в WooCommerce

Незавершённые заказы (статус "pending" или "failed") накапливаются в базе данных WooCommerce и могут влиять на производительность сайта, создавать путаницу в отчётах и усложнять управление заказами. Автоматическое удаление таких заказов помогает поддерживать базу данных в чистоте, ускоряет работу сайта и упрощает аналитику.

Диагностика проблемы с незавершёнными заказами

Чтобы проверить наличие незавершённых заказов на вашем WooCommerce-сайте, выполните запрос к базе данных или используйте встроенный фильтр в админке WooCommerce:

  • Перейдите в WooCommerce → Заказы.
  • В фильтре статусов выберите Ожидает оплаты (pending) или Неудачный (failed).
  • Если количество заказов велико и заказы старше нескольких дней, это повод задуматься об автоматизации их удаления.

Для более точного анализа можно выполнить SQL-запрос к таблице wp_posts (или с вашим префиксом):

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') ORDER BY post_date ASC;

Если в результатах много заказов старше 7-10 дней, автоматизация будет полезна.

Пошаговое решение: автоматическое удаление незавершённых заказов через wp-cron

Реализуем автоматическую очистку заказов со статусом wc-pending и wc-failed, которым больше N дней (например, 7).

1. Добавляем регулярное задание в WordPress Cron

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

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

function wc_delete_old_pending_orders() {
    $days = 7; // количество дней
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array( 'wc-pending', 'wc-failed' ),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true ); // true — удаление без перемещения в корзину
        }
    }
}
add_action( 'wc_delete_old_pending_orders_hook', 'wc_delete_old_pending_orders' );

3. Проверка работы cron и удаления заказов

  • Проверьте, что событие wc_delete_old_pending_orders_hook запланировано: используйте плагин WP Crontrol или вызовите wp_next_scheduled('wc_delete_old_pending_orders_hook').
  • Для теста можно вызвать функцию wc_delete_old_pending_orders() вручную из консоли WP-CLI:
    wp eval 'wc_delete_old_pending_orders();'
  • После запуска проверьте раздел заказов в админке — старые незавершённые заказы должны исчезнуть.

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

Для контроля работы решения:

  • Отфильтруйте заказы по статусам wc-pending и wc-failed и убедитесь, что старые записи удалены.
  • Отслеживайте лог cron-событий с помощью плагинов или WP-CLI, чтобы убедиться, что задача запускается ежедневно.
  • При необходимости добавьте логирование в функцию удаления:
function wc_delete_old_pending_orders() {
    $days = 7;
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
    $args = array(
        'post_type' => 'shop_order',
        'post_status' => array( 'wc-pending', 'wc-failed' ),
        'date_query' => array(
            array( 'column' => 'post_date', 'before' => $date ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );
    $orders = get_posts( $args );
    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            if ( wp_delete_post( $order_id, true ) ) {
                error_log( "Удалён заказ ID: {$order_id}" );
            }
        }
    }
}

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

  • Функция не запускается: проверьте, что cron-событие правильно запланировано и что WP-Cron работает (сайт посещается, или настроен системный cron).
  • Заказы не удаляются: убедитесь, что статусы заказов указаны правильно с префиксом wc-, и у пользователя, под которым выполняется код, есть права на удаление.
  • Удаляются не те заказы: проверьте аргументы date_query и статус заказа. Можно добавить дебаг-запрос, чтобы увидеть, какие заказы попадают под выборку.
  • Удаление влияет на аналитику: если вы используете внешние отчёты, заранее сохраните статистику или настройте исключение удаляемых заказов из аналитики.

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

  • Не удаляйте заказы, которые могут быть важны для бухгалтерии или аудита без согласования с соответствующими отделами.
  • Если заказов много, разбивайте удаление по частям (пагинация), чтобы избежать тайм-аутов и перегрузки сервера.
  • Для критичных сайтов лучше запускать cron через системный планировщик (crontab), а не на основе посещений сайта.
  • Добавьте резервное копирование перед внедрением автоматического удаления.
  • Для расширенной функциональности рассмотрите плагины очистки WooCommerce, например Clearfy Pro с https://wpshop.ru/plugins/clearfy?source=wpmy.ru&medium=article&campaign=woocommerce-kak-udalit-nezavershennye-zakazy-avtomaticheski — они позволяют дополнительно оптимизировать базу и автоматизировать задачи.

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

МетодПреимуществаНедостаткиПодходит для
Ручное удаление в админке WooCommerceПростота, контрольВремя, неудобно при большом количестве заказовМалые сайты с редкими незавершёнными заказами
WP-Cron с кастомным кодом (как в статье)Автоматизация, гибкостьЗависит от посещаемости сайта, требует навыковСредние и крупные сайты с регулярным потоком заказов
Плагины оптимизации (например Clearfy Pro)Дополнительные функции очистки, поддержкаПлатные, возможно избыточно для простых задачСайты с интенсивной нагрузкой и комплексной оптимизацией
Как использовать WP-Cron для автоматизации задач в WordPress
14.01.2026
Как создать автоматическую удалённую регистрацию пользователей в WordPress с проверкой данных
27.01.2026
Автоматическое удаление нерабочих изображений в WordPress
13.04.2026
Как удалить удалённые публикации в WordPress через REST API с примерами кода
22.12.2025
Как удалить неиспользуемые таблицы базы данных WordPress
21.02.2026