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

Что такое временно неактивные заказы в WooCommerce и зачем их удалять

В WooCommerce под временно неактивными заказами обычно понимают заказы со статусом pending или failed, которые остаются в базе долгое время без оплаты или подтверждения. Они занимают место в базе данных, влияют на отчеты и замедляют работу административной панели. Регулярное удаление таких заказов помогает поддерживать чистоту данных и оптимизировать производительность магазина.

Диагностика проблемы: как определить количество и возраст неактивных заказов

Для начала стоит узнать, сколько заказов в статусах pending и failed накопилось, и как долго они находятся в базе. Это можно сделать с помощью следующего SQL-запроса через phpMyAdmin или WP CLI:

SELECT post_status, COUNT(ID) AS count, MIN(post_date) AS oldest_order FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') GROUP BY post_status;

Результаты покажут количество заказов каждого статуса и дату самого старого заказа. Если заказы висят месяц и дольше, их стоит почистить.

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

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

function wc_delete_old_inactive_orders( $days = 30 ) {
    global $wpdb;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID заказов с wc-pending и wc-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 ); // true - удаляет полностью, минуя корзину
        }
    }
}

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

add_action( 'wc_daily_delete_old_orders', 'wc_delete_old_inactive_orders' );

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

3. Опционально: задаем период хранения в днях через фильтр

add_filter( 'wc_delete_old_orders_days', function() {
    return 15; // удалить заказы старше 15 дней
} );

// Обновим функцию для использования фильтра
function wc_delete_old_inactive_orders( $days = null ) {
    global $wpdb;
    $days = $days ?: apply_filters( 'wc_delete_old_orders_days', 30 );
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $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 );
        }
    }
}

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

Для проверки, что скрипт сработал:

  • Запустите вручную функцию wc_delete_old_inactive_orders(1) через functions.php или WP CLI, чтобы удалить заказы старше 1 дня.
  • Проверьте в админке WooCommerce раздел «Заказы» — количество заказов со статусом pending и failed должно уменьшиться.
  • Проверьте отчетность WooCommerce — удаление старых заказов не должно влиять на заказы со статусом processing и completed.

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

  • Заказы не удаляются: Проверьте, что WP Cron работает на сайте. Для сайтов с низкой посещаемостью стоит настроить системный cron или запускать его вручную.
  • Удаляются нужные заказы: Убедитесь, что фильтр статусов 'wc-pending', 'wc-failed' не включает рабочие статусы.
  • Проблемы с производительностью при большом количестве заказов: Можно изменить функцию на удаление порциями, например, по 100 заказов за раз, чтобы избежать таймаута.

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

  • Используйте wp_delete_post( $order_id, true ) для полного удаления данных, включая метаданные и связанные записи.
  • Не удаляйте заказы со статусом processing или выше — это может привести к потере данных о реальных заказах.
  • Для сайтов с большим объемом заказов создайте отдельный плагин или mu-плагин для устойчивой работы и контроля.
  • Регулярно делайте резервные копии базы данных перед автоматическим удалением.
  • Мониторьте логи сервера и ошибок WordPress для своевременного выявления сбоев WP Cron.

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

МетодПлюсыМинусыКому подходит
Удаление через WP Cron с кодомАвтоматизация, гибкость, бесплатное решениеЗависит от работы WP Cron, требует навыковРазработчики, средние и крупные магазины
Удаление через плагины (например, WP-Optimize)Простота использования, графический интерфейсМогут удалять лишнее, меньше контроляНовички, небольшие сайты
Ручное удаление через админку или SQLПолный контроль, однократное удалениеТрудоемко, риск ошибокМалый объем заказов, администраторы
Как использовать хуки в WordPress для настройки темы: практические примеры
20.11.2025
Как создать собственный виджет WordPress с использованием классов
13.11.2025
Как удалить отзывы WooCommerce по статусу и дате через код
03.07.2026
Автоматическая установка и настройка плагинов WordPress через код
21.02.2026
Как создать динамические таблицы в WordPress с помощью шорткодов
06.01.2026