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

Проблема: накопление неоплаченных заказов в WooCommerce

В интернет-магазинах на WooCommerce часто возникает ситуация, когда неоплаченные заказы накапливаются в админке. Это затрудняет управление заказами и может повлиять на аналитику и производительность базы данных. WooCommerce не удаляет такие заказы автоматически — их нужно либо обрабатывать вручную, либо настроить автоматическое удаление.

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

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

  • Откройте раздел WooCommerce > Заказы.
  • Отфильтруйте заказы по статусу Ожидает оплаты или В обработке, если платеж не завершен.
  • Обратите внимание на дату создания заказа — если есть заказы старше 7 или 14 дней, их стоит удалить.

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

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

1. Создаем пользовательский WP-Cron для удаления старых неоплаченных заказов

Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:

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

function wpall_delete_old_unpaid_orders() {
    $days = 7; // удалить неоплаченные заказы старше 7 дней
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'status' => array('pending', 'failed'), // статусы неоплаченных заказов
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // безвозвратно удаляем заказ
    }
}
add_action( 'wpall_delete_unpaid_orders_hook', 'wpall_delete_old_unpaid_orders' );

2. Настройка интервала запуска

Здесь мы используем стандартный интервал daily. Если хотите запускать чаще (например, ежечасно), можно добавить свой интервал:

function wpall_custom_cron_intervals( $schedules ) {
    $schedules['hourly'] = array(
        'interval' => 3600,
        'display' => __( 'Каждый час' ),
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'wpall_custom_cron_intervals' );

3. Как отключить задачу, если нужно

Чтобы отменить запланированное событие, используйте:

$timestamp = wp_next_scheduled( 'wpall_delete_unpaid_orders_hook' );
if ( $timestamp ) {
    wp_unschedule_event( $timestamp, 'wpall_delete_unpaid_orders_hook' );
}

Проверка результата

  • Через несколько дней проверьте раздел Заказы в админке WooCommerce — старые неоплаченные заказы должны быть удалены.
  • Для теста можно изменить переменную $days на 0 или 1 и выполнить функцию вручную, вызвав do_action('wpall_delete_unpaid_orders_hook'); в админке или через WP-CLI.
  • Также можно проверить базу данных — таблицу wp_posts с типом shop_order, убедиться, что старые заказы удалены.

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

  • Неправильные статусы заказов в фильтре. В WooCommerce неоплаченные заказы обычно имеют статус pending или failed. Если не указать их, функция ничего не удалит.
  • Неправильное использование даты. Для сравнения дат нужно использовать формат MySQL (Y-m-d H:i:s). Иначе запрос не сработает.
  • Задача WP-Cron не запускается. Если на сайте мало посетителей, WP-Cron может не сработать. Рекомендуется настроить системный cron на сервере для вызова wp-cron.php.
  • Удаление заказов с важными данными. Убедитесь, что удаляете только неоплаченные заказы. Проверьте логику фильтрации, чтобы не потерять важные данные.

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

  • Всегда создавайте резервные копии базы данных перед автоматическим удалением.
  • Удаление заказов производится безвозвратно (wp_delete_post( $order_id, true )). При необходимости можно сначала переместить заказы в корзину (false вторым параметром) для дополнительной проверки.
  • Если у вас большой магазин с тысячами заказов, для удаления лучше использовать WP-CLI или пакетную обработку по частям, чтобы избежать таймаутов.
  • Для более продвинутой очистки можно дополнительно удалять метаданные заказов и связанные записи (например, транзакции платежей), используя функции WooCommerce API.

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

ВариантПлюсыМинусы
WP-Cron с кастомной функциейПолный контроль, легко настроить под свои нужды, без сторонних плагиновWP-Cron зависит от посещений сайта, возможны проблемы с производительностью на больших магазинах
Плагин автоматического удаления заказовПростота настройки, готовые решенияМожет добавлять лишний код, не всегда гибко
WP-CLI скрипты для пакетного удаленияВысокая производительность, можно запускать вручную или по cron серверуТребует доступа к серверу и навыков работы с терминалом
Как удалить неиспользуемые мета данные в WordPress: эффективные методы и примеры кода
26.01.2026
Как удалить устаревшие записи и метаданные в WordPress по расписанию
16.02.2026
WooCommerce: автоматическое удаление неоплаченных заказов по срокам
19.05.2026
Автообновление статуса заказа в WooCommerce по срокам
25.04.2026
Автообновление статуса заказа в WooCommerce по срокам
17.04.2026