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

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

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

Как понять, что автоматизация нужна?

  • В WooCommerce накапливается большое количество заказов со статусом pending или failed.
  • Администратору приходится вручную чистить базу от неактивных заказов.
  • Производительность сайта снижается из-за разрастания таблиц заказов.

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

Реализуем cron-задачу, которая ежедневно будет удалять заказы в статусе pending и старше 24 часов.

Шаг 1. Добавляем функцию удаления заказов

function wpapp_delete_old_pending_orders() {
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders( $args );

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            $order->delete( true ); // true - принудительное удаление
        }
    }
}

Шаг 2. Регистрируем cron-задачу для ежедневного запуска

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

add_action( 'wpapp_daily_order_cleanup_hook', 'wpapp_delete_old_pending_orders' );

Шаг 3. Очистка cron при деактивации темы или плагина

function wpapp_clear_scheduled_order_cleanup() {
    $timestamp = wp_next_scheduled( 'wpapp_daily_order_cleanup_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpapp_daily_order_cleanup_hook' );
    }
}
register_deactivation_hook( __FILE__, 'wpapp_clear_scheduled_order_cleanup' );

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

  • Создайте тестовый заказ со статусом pending и датой создания более 24 часов назад (можно через админку или программно).
  • Запустите вручную функцию wpapp_delete_old_pending_orders() через консоль WP-CLI или временно вызовите её в теме.
  • Проверьте, что заказ удалился из админки WooCommerce.
  • Убедитесь, что cron-задача запланирована, выполнив команду WP-CLI wp cron event list и найдя wpapp_daily_order_cleanup_hook.

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

  • Не удаляются заказы: Проверьте, что статусы заказов точно pending. Можно расширить поиск по статусам failed или другим.
  • Функция удаляет заказы, которые не нужно: Убедитесь, что условие по дате корректно. Используйте для отладки вывод ID заказов, которые будут удалены.
  • Cron-задача не запускается: Проверьте, что на сайте работают WP-Cron. Если сайт малопосещаемый, настройте системный cron или запуск по реальному расписанию.
  • Ошибка при удалении заказа: Убедитесь, что используете метод $order->delete(true); с параметром true, чтобы удаление было принудительным.

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

  • Не удаляйте заказы с другими статусами без явной необходимости — это может привести к потере данных.
  • Для масштабных магазинов лучше использовать WP-CLI и системный cron, чтобы избежать задержек при выполнении заданий.
  • Добавьте логирование удаляемых заказов в файл для аудита, например:
function wpapp_delete_old_pending_orders() {
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders( $args );

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            error_log( "Удаление заказа #" . $order_id . " статус pending старше 24 часов" );
            $order->delete( true );
        }
    }
}

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

МетодПлюсыМинусыПодходит для
Ручное удаление через админкуПростота, не требует кодаТрудоемко при большом числе заказов, риск ошибкиМаленькие магазины
Плагины очистки заказовГотовое решение, часто с расширенными настройкамиДополнительный плагин, нагрузка, возможные конфликтыСредние магазины
Код с WP-Cron (как в статье)Контроль, гибкость, без лишних плагиновТребует навыков разработки, нужно следить за cronЛюбые магазины с разработчиком

Наш каталог плагинов WordPress