WooCommerce: автоматическое удаление просроченных заказов с помощью кода

Что такое просроченные заказы в WooCommerce и зачем их удалять

В WooCommerce под просроченными обычно понимаются заказы, которые долго находятся в статусе, не предполагающем дальнейшую обработку, например, "Ожидает оплаты" или "В ожидании". Такие заказы могут засорять базу данных, замедлять сайт и создавать путаницу в отчетах. Автоматическое удаление таких заказов позволяет поддерживать базу в актуальном состоянии без ручного вмешательства.

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

Для начала нужно определить, какие заказы считать просроченными. Обычно это заказы, которые не изменяли статус длительное время, например, 7 дней или более. Проверить это можно, выполнив запрос к базе данных или через админку, отфильтровав заказы по статусу и дате создания.

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < NOW() - INTERVAL 7 DAY;

Если таких заказов много и они не актуальны, есть смысл настроить автоматическую очистку.

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

1. Создаем функцию удаления просроченных заказов

function wps_remove_expired_orders() {
    $args = array(
        'status'        => 'pending',
        'date_created'  => '<' . ( new WC_DateTime() )->modify( '-7 days' )->date( 'Y-m-d H:i:s' ),
        'limit'         => -1,
        'return'        => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

2. Регистрируем событие в wp_cron

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

add_action( 'wps_expired_orders_cleanup_hook', 'wps_remove_expired_orders' );

Этот код запустит функцию удаления один раз в день. При необходимости можно изменить периодичность, добавив кастомный интервал в WP Cron.

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

  • В админке WooCommerce проверьте наличие заказов со статусом "Ожидает оплаты" старше 7 дней — их не должно быть после запуска скрипта.
  • Вручную создайте тестовый заказ со статусом "pending" и датой старше 7 дней, затем запустите wp_cron вручную (через сайт или плагин WP Crontrol), и проверьте, удалился ли он.
  • Проверьте логи ошибок сервера и WordPress на предмет возможных сбоев.

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

  • Неправильный статус заказа в запросе: в WooCommerce статус в коде указывается без префикса "wc-", используйте 'pending' вместо 'wc-pending'.
  • Отсутствие прав на удаление: убедитесь, что функция вызывается в контексте с достаточными правами, иначе wp_delete_post может не сработать.
  • wp_cron не запускается: если на сайте мало трафика, wp_cron может не срабатывать. Рассмотрите настройку системного cron на сервере.
  • Заказы не удаляются, а только меняют статус: убедитесь, что используете wp_delete_post с вторым параметром true для полного удаления, а не только изменения статуса.

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

  • Перед удалением заказов создавайте резервные копии базы данных, особенно если магазин большой.
  • При большом количестве заказов добавьте логирование процесса удаления для отслеживания ошибок.
  • Если в магазине используются сторонние плагины, влияющие на заказы, проверьте, что удаление заказов не нарушит их работу.
  • Для повышения производительности можно разбивать удаление на партии, например, удалять по 50 заказов за один запуск.

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

МетодПлюсыМинусыКомпромисс
Код через wp_cronГибкость, бесплатно, без плагиновЗависит от трафика, требует технических знанийНастроить системный cron для надежности
Плагины (например, Advanced Order Cleanup)Простота настройки, готовые настройкиМожет нагружать сайт, ограниченная гибкостьИспользовать на небольших магазинах
Ручная очистка через админкуБезопасно, контролируемоТрудоемко, не автоматизированоИспользовать для тестирования и разовых случаев
Как создать собственный шорткод в WordPress
06.11.2025
Как создать автоматический раздел постов в WordPress по дате и категории
08.03.2026
Как создать динамические виджеты на PHP
18.11.2025
Автоматическое удаление старых записей WordPress через хуки и wp_schedule_event
08.02.2026
Как удалить или изменить атрибуты img в WordPress без плагинов
20.02.2026