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

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

В WooCommerce неоплаченные заказы (статус "pending" или "on-hold") могут накапливаться, если покупатели не завершают оплату. Это засоряет базу данных, замедляет работу сайта и создает проблемы с анализом статистики. Стандартные средства WooCommerce не всегда удаляют такие заказы автоматически.

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

1. Определяем таймаут для удаления заказов

Выбираем период, по истечении которого неоплаченный заказ считается «просроченным» и подлежит удалению. Обычно это 1-3 дня (86400-259200 секунд).

2. Реализация удаления через wp_cron

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

if ( ! wp_next_scheduled( 'wpkey_delete_expired_orders' ) ) {
    wp_schedule_event( time(), 'hourly', 'wpkey_delete_expired_orders' );
}

add_action( 'wpkey_delete_expired_orders', 'wpkey_remove_expired_orders' );

function wpkey_remove_expired_orders() {
    $timeout = 86400; // 24 часа
    $date_threshold = date( 'Y-m-d H:i:s', time() - $timeout );

    $args = array(
        'status' => array( 'pending', 'on-hold' ),
        'date_modified' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

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

3. Добавление настройки таймаута в functions.php

Если нужно менять период удаления без правки кода, можно добавить фильтр:

function wpkey_expired_order_timeout() {
    return 2 * 86400; // 2 дня
}
add_filter( 'wpkey_expired_order_timeout', 'wpkey_expired_order_timeout' );

// И использовать в функции удаления:
// $timeout = apply_filters( 'wpkey_expired_order_timeout', 86400 );

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

  • Создайте заказ в статусе "pending" и установите дату создания более суток назад (можно через базу или программно).
  • Запустите вручную функцию wpkey_remove_expired_orders() из консоли WP-CLI или временно вызовите её через админку.
  • Проверьте, что заказ удалился из базы (в разделе WooCommerce или через базу данных).
  • Проверьте логи ошибок и убедитесь, что нет предупреждений.

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

  • Неправильный формат даты в запросе: Используйте формат Y-m-d H:i:s и проверяйте, что дата корректно вычисляется.
  • Отсутствие прав на удаление заказов: Убедитесь, что код выполняется с правами администратора или через WP Cron.
  • Планировщик wp_cron не запускается: Настройте системный cron или вызовите wp_cron вручную, чтобы не зависеть от посещений сайта.
  • Удаляются не те заказы: Проверьте статусы и дату изменения, чтобы не затронуть важные заказы.

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

  • Включите резервное копирование перед внедрением удаления заказов.
  • Ограничьте количество удаляемых заказов за один запуск, если у вас очень большой магазин (например, 'limit' => 50).
  • Логируйте удаление заказов в отдельный файл для аудита.
  • Используйте транзакции базы данных, если потребуется сложное удаление связанных данных.

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

МетодПреимуществаНедостатки
Плагин (например, WP Rocket или специальные WooCommerce)Простота настройки, поддержка и обновленияМожет замедлять сайт, лишний код, зависимость от автора
Собственный код с wp_cron (как в статье)Тонкая настройка, минимум стороннего кода, контрольТребует навыков, настройка cron, поддержка с вашей стороны
Ручное удаление через базу данныхПолный контроль, быстроРиск ошибок, потеря данных, требует SQL-знаний
Как защитить WordPress от Brute Force атак: приватные методы и примеры кода
12.01.2026
Как избежать проблем с отзывами пользователей в WordPress
25.12.2025
Как удалить файл из медиатеки WordPress по ссылке
06.12.2025
WooCommerce: решение проблемы, когда не отображаются способы оплаты при использовании разных плагинов
28.06.2026
Как создать собственный виджет в WordPress с поддержкой AJAX
10.12.2025

Ресурс в разработке, скоро здесь будет сайт по вордпресс