WooCommerce: автоматическое удаление неоплаченных заказов после 48 часов без плагинов

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

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

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

В админке WooCommerce в разделе Заказы можно посмотреть статус заказов и время их создания. Если вы видите много неоплаченных заказов (статус pending или failed), которые висят по несколько дней, значит, накопление происходит. 48 часов — это стандартный срок ожидания оплаты, после которого заказ считается «заброшенным».

Проверка:

  • В админке перейдите в WooCommerce → Заказы.
  • Отфильтруйте заказы по статусу pending.
  • Проверьте дату создания заказов. Если есть заказы старше 2 дней — автоматизация актуальна.

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

1. Создаем функцию для удаления заказов старше 48 часов со статусом pending

function wptask_delete_old_pending_orders() {
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . ( new WC_DateTime( '-48 hours' ) )->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 ); // true - безвозвратно
    }
}

2. Регистрируем WP-Cron событие для запуска функции ежедневно

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

add_action( 'wptask_daily_order_cleanup_hook', 'wptask_delete_old_pending_orders' );

3. Опционально: добавить функцию отмены события при деактивации темы или плагина

function wptask_clear_scheduled_order_cleanup() {
    $timestamp = wp_next_scheduled( 'wptask_daily_order_cleanup_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wptask_daily_order_cleanup_hook' );
    }
}

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

  • Запустите функцию вручную для теста:
wptask_delete_old_pending_orders();
  • Проверьте в админке WooCommerce → Заказы, что заказы со статусом pending старше 48 часов удалились.
  • Через 24 часа проверьте, что WP-Cron сработал, и заказы удалены автоматически.
  • Для диагностики можно использовать плагин Cron Events Inspector или WP-CLI команду wp cron event list.

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

1. Заказы не удаляются

  • Проверьте, что WP-Cron работает на вашем сервере. На локалках и некоторых хостингах WP-Cron может быть отключён.
  • Запустите функцию вручную, чтобы проверить ошибки.
  • Проверьте права пользователя на удаление постов.

2. Удаляются не только неоплаченные заказы

  • Убедитесь, что в параметрах wc_get_orders указан правильный статус — pending.
  • Проверьте формат даты и время в аргументе date_created.

3. Функция вызывает ошибки PHP

  • Проверьте корректность синтаксиса кода и версию WooCommerce (функция wc_get_orders доступна с WooCommerce 3.0+).
  • Логируйте ошибки через error_log() или используйте WP_DEBUG.

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

  • Удаление заказов безвозвратно удаляет данные. Делайте резервные копии базы данных перед внедрением.
  • Для больших магазинов рекомендуется запускать очистку в ночное время, чтобы не нагружать базу в часы пик.
  • Если заказов очень много, делайте удаление пакетами, например по 50 заказов за вызов, чтобы избежать таймаутов.
  • WP-Cron зависит от посещаемости сайта. Для критичных задач рассмотрите системный cron на сервере с wp-cli.

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

МетодПлюсыМинусыПример
Кастомный код + WP-CronБез плагинов, гибкость, полный контрольЗависит от WP-Cron, требует навыков PHPКод из статьи
Плагин «WooCommerce Cancel Unpaid Orders»Простая настройка, готовое решениеДоп нагрузка на сайт, ограничения функционалассылка
Системный cron + wp-cliНадежность, не зависит от посещаемостиТребует доступа к серверу, знания CLIwp cron event run или custom скрипт
Добавление полей в профиль пользователя WordPress: подробное руководство
04.12.2025
Автоматическое создание отчёта об ошибках в WordPress
12.12.2025
Как создать автоматический кэш в WordPress с использованием Redis
07.02.2026
Автоматическое удаление неиспользуемых плагинов в WordPress: практическое руководство
15.02.2026
Как изменить логин пользователя в WordPress без переустановки и регистрации
26.12.2025