Автоматическое удаление временно неактивных заказов 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Полный контроль, однократное удалениеТрудоемко, риск ошибокМалый объем заказов, администраторы
Автоматическое удаление временно неактивных заказов WooCommerce
06.05.2026
Как создать адаптивные блоки в WordPress Gutenberg
02.12.2025
Как избежать проблем с совместимостью плагинов WooCommerce
26.04.2026
Оптимизация загрузки изображений в WordPress: лучшие практики и плагины
25.11.2025
Как автоматизировать управление ролями и правами в WordPress
24.03.2026