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

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

В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают ресурсы базы данных и усложняют управление заказами. Если не очищать такие заказы, админка становится менее удобной, а отчеты и аналитика – менее точными. Задача — автоматическое удаление заказов со статусом pending или failed, которые не оплачены и старше определенного срока.

Типичные симптомы

  • В админке WooCommerce много заказов со статусом «Ожидает оплаты» или «Ошибка»;
  • Отчеты по заказам показывают завышенные цифры;
  • Увеличивается нагрузка на базу данных;
  • Ручная очистка заказов занимает много времени.

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

Реализуем автоматическую очистку с помощью WP-Cron, который будет запускаться раз в сутки и удалять неоплаченные заказы старше 3 дней. В коде ниже показано, как создать собственное событие и обработчик.

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

function wpsource_cleanup_unpaid_orders_callback() {
    global $wpdb;
    $days = 3; // количество дней, по истечении которых заказы удаляются
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID заказов со статусом pending и failed старше даты
    $order_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < %s",
        $date_threshold
    ) );

    if ( ! empty( $order_ids ) ) {
        foreach ( $order_ids as $order_id ) {
            wp_delete_post( $order_id, true ); // принудительное удаление
        }
    }
}
add_action( 'wpsource_cleanup_unpaid_orders', 'wpsource_cleanup_unpaid_orders_callback' );

Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин. Он создаёт задачу, которая запускается ежедневно и удаляет все заказы с указанными статусами, которые старше 3 дней.

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

  1. Создайте тестовый заказ с статусом pending.
  2. Измените его дату создания на дату более 3 дней назад через базу данных или плагин для редактирования заказов.
  3. Запустите вручную крон-задачу, используя плагин WP Crontrol или WP-CLI: wp cron event run wpsource_cleanup_unpaid_orders.
  4. Проверьте, что заказ удалён из админки WooCommerce и из базы данных (таблица wp_posts).

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

  • Крон-задача не запускается: Убедитесь, что на сайте включён WP-Cron, и проверяйте логи ошибок. Иногда необходимо настроить реальный системный cron для запуска wp-cron.php.
  • Заказы не удаляются: Проверьте правильность статусов заказов. WooCommerce сохраняет статусы с префиксом wc-, например, wc-pending, а не просто pending.
  • Удаление не полное: Используйте параметр true в wp_delete_post, чтобы обойти корзину и сразу удалить записи.
  • Ошибка прав доступа: Убедитесь, что код выполняется с достаточными правами, и что пользователь, запускающий WP-Cron, имеет доступ к базе данных.

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

  • Перед автоматическим удалением рекомендуется делать резервные копии базы данных.
  • Не задавайте слишком короткий срок удаления — 3 дня достаточно для большинства магазинов, чтобы покупатель имел возможность оплатить.
  • Если заказов много, можно реализовать пакетную обработку с лимитом, чтобы избежать таймаутов.
  • Логируйте удалённые заказы в отдельный файл для аудита и диагностики.
  • Используйте WP-CLI для запуска крон-задач в продакшене, чтобы повысить надежность.

Сравнение методов удаления неоплаченных заказов

Метод Плюсы Минусы
Плагин очистки заказов Простота установки, готовые настройки, поддержка Может влиять на производительность, лишние зависимости
Собственный WP-Cron скрипт (как в статье) Контроль над процессом, легковесность, нет лишних плагинов Требует навыков, возможны ошибки в коде, нужно тестировать
Ручная очистка через админку Простота, контроль вручную Трудоемко, неудобно при большом количестве заказов
WooCommerce: решение проблем с невалидными атрибутами и тегами для корректного SEO
09.06.2026
Отсрочка загрузки картинок (Lazy Load) в WordPress с поддержкой WooCommerce
25.12.2025
Как добавить фильтр по мета-полям в админке WordPress
01.03.2026
Как создать динамический фильтровый поиск в WordPress с поддержкой AJAX
04.04.2026
Как удалить записи определённого типа по условию в WordPress с примером кода
24.02.2026