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

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

В интернет-магазинах на WooCommerce со временем накапливается большое количество заказов со статусами cancelled и failed или незавершенных заказов (например, в статусе pending), которые не несут ценности, но замедляют работу админки и увеличивают базу данных. Если не очищать такие заказы, это может привести к замедлению запросов, росту размера базы и усложнению аналитики.

Основная задача — автоматизировать удаление таких заказов по заданному периоду (например, старше 30 дней), чтобы поддерживать базу данных WooCommerce в актуальном и оптимальном состоянии.

Какие статусы заказов нужно очищать

Чаще всего удаляют заказы со статусами:

  • cancelled — отменённые пользователем или администратором;
  • failed — неудачные попытки оплаты;
  • pending и on-hold — незавершённые (например, неоплаченные в течение долгого времени).

Для каждого магазина набор статусов может отличаться. Важно протестировать, какие статусы у вас считаются «мусорными».

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

Реализуем удаление заказов через планировщик задач WordPress (WP-Cron), чтобы очистка происходила автоматически, например, раз в неделю.

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

function wc_delete_old_orders_by_status_and_date( $statuses = array('cancelled', 'failed'), $days = 30 ) {
    if ( empty( $statuses ) ) {
        return;
    }

    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array_map( function($status) { return 'wc-' . $status; }, $statuses ),
        'date_query'     => array(
            array(
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    );

    $query = new WP_Query( $args );

    if ( ! empty( $query->posts ) ) {
        foreach ( $query->posts as $order_id ) {
            wp_delete_post( $order_id, true );
        }
    }
}

2. Добавляем задачу в WP-Cron для еженедельного запуска

function wc_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wc_weekly_order_cleanup_event' ) ) {
        wp_schedule_event( time(), 'weekly', 'wc_weekly_order_cleanup_event' );
    }
}
add_action( 'wp', 'wc_schedule_order_cleanup' );

add_action( 'wc_weekly_order_cleanup_event', function() {
    wc_delete_old_orders_by_status_and_date( array('cancelled', 'failed', 'pending'), 30 );
} );

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

  1. Зайдите в админку WooCommerce — заказы и проверьте, что заказы со статусами cancelled, failed и pending, созданные более 30 дней назад, удалены.
  2. Для теста можно временно уменьшить значение $days до 1 и проверить, что удаление работает.
  3. Проверьте журнал ошибок PHP, чтобы убедиться, что не возникает ошибок при удалении.
  4. Запустите вручную функцию из консоли WP-CLI или через временный вызов в коде для проверки.

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

  • Не удаляются заказы: проверьте, что статусы заказов корректно передаются с префиксом wc-, например, wc-cancelled. Без этого статусы не распознаются.
  • Удаление не происходит по расписанию: убедитесь, что WP-Cron работает — для этого можно использовать плагин WP Crontrol или проверить логи сервера. Если трафика мало, WP-Cron может не срабатывать, используйте системный cron.
  • Переполнение памяти при большом количестве заказов: если заказов слишком много, используйте постраничный запрос (pagination) с ограничением по posts_per_page, чтобы удалять по частям.
  • Удаление не навсегда: параметр wp_delete_post должен быть вызван с true во втором аргументе, чтобы удалять без помещения в корзину.

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

  • Всегда делайте резервную копию базы данных перед автоматическим удалением данных.
  • Ограничьте удаление заказов по дате, чтобы не потерять важные данные.
  • Для сайтов с большим количеством заказов используйте пакетную обработку с пагинацией, чтобы не перегружать сервер.
  • Используйте системный CRON вместо WP-Cron для надежной регулярности выполнения.
  • Логируйте удаленные заказы (например, в отдельный файл или таблицу), чтобы было проще восстановить данные при ошибках.

Сравнение вариантов удаления заказов

МетодПлюсыМинусы
Удаление через WP-Cron + кодАвтоматизация, гибкость, без дополнительных плагиновЗависит от работы WP-Cron, требует навыков программирования
Удаление вручную через админкуПростота, не требует кодаТрудозатратно при большом объеме данных
Плагины для очистки WooCommerceУдобный интерфейс, дополнительные функцииМогут замедлять сайт, требуют обновлений, не всегда гибко
Как создать собственный тип записей WordPress для необычной структуры данных
09.01.2026
Как отладить проблемы со стилями в WordPress: пошаговое руководство
17.02.2026
Удаление продаж WooCommerce по дате и статусу: практическое руководство
03.05.2026
Как избежать проблем с совместимостью плагинов WooCommerce
26.04.2026
Как создать автоматические уведомления в WordPress по событиям с помощью WPRemark
04.03.2026