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

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

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

Цель — автоматически удалять заказы со статусом pending, failed или подобными, если они старше заданного срока, например, 30 дней.

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

Первым делом убедитесь, какие статусы заказов у вас считаются неактивными и сколько таких заказов в базе:

SELECT post_status, COUNT(*) AS count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Выполните этот запрос через phpMyAdmin или WP-CLI. Если количество заказов с статусом pending или failed большое и они старые, это повод для автоматизации их удаления.

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

1. Создаем функцию очистки заказов

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

function wc_delete_old_inactive_orders() {
    $days = 30; // Период хранения заказов
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем заказы со статусом pending или failed старше $days
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            array(
                'before' => $date,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Можно использовать wp_delete_post для полного удаления
        }
    }
}

2. Добавляем крон-задачу для регулярного запуска

Чтобы функция запускалась автоматически, зарегистрируем крон-событие:

add_action('wc_daily_delete_old_orders', 'wc_delete_old_inactive_orders');

function wc_schedule_daily_order_cleanup() {
    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_order_cleanup');

Этот код создаст задачу, которая будет запускаться раз в сутки и удалять старые неактивные заказы.

3. Очистка и отмена задачи (при необходимости)

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

function wc_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wc_daily_delete_old_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_daily_delete_old_orders');
    }
}

Вызовите функцию wc_clear_order_cleanup_schedule() один раз, например, через админ-панель.

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

  • Подождите сутки или вручную вызовите функцию wc_delete_old_inactive_orders() через консоль WP-CLI wp eval 'wc_delete_old_inactive_orders();'
  • Проверьте, что заказы со статусом pending и датой создания старше 30 дней перемещены в корзину или удалены (если замените wp_trash_post на wp_delete_post)
  • В админке WooCommerce проверьте количество заказов с этими статусами — они должны уменьшиться
  • Проверьте журнал cron-задач с помощью плагина WP Crontrol или аналогичного, чтобы убедиться, что задача запланирована

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

1. Заказы не удаляются

  • Причина: функция не вызывается. Проверьте, что крон-задача запущена, или вызовите функцию вручную.
  • Причина: неправильные статусы заказов. В WooCommerce статусы заказов имеют префикс wc-, например, wc-pending. Убедитесь, что они указаны верно.

2. Функция удаляет лишние заказы

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

3. Ошибки при удалении заказов

  • Убедитесь, что у PHP и WordPress есть права на удаление постов.
  • Проверьте логи ошибок сервера.

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

  • Используйте wp_trash_post() вместо wp_delete_post() для возможности восстановления заказов из корзины.
  • Если заказов очень много, разбивайте удаление на партии по 100-200 штук, чтобы избежать таймаута.
  • Для мониторинга работы крон-задач используйте плагин Clearfy Pro, который позволяет отследить и оптимизировать задачи WP-Cron.
  • Период хранения настраивайте исходя из специфики бизнеса — например, для предоплаченных заказов можно сделать отдельные правила.

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

МетодПлюсыМинусы
Ручное удаление через админкуПростотаТрудозатратно, риск пропуска заказов
SQL-запросы в базеБыстро и эффективноРиск ошибочного удаления, требует знаний SQL
WP-Cron с PHP-функцией (решение в статье)Автоматизация, безопасно (корзина), гибкостьЗависит от работы WP-Cron, требует настройки
Как настроить автоматическое сохранение данных в формах WordPress
25.01.2026
Отложенная загрузка картинок в WordPress: как ускорить сайт и снизить нагрузку
17.01.2026
Как отключить AJAX загрузку товаров в WooCommerce
06.12.2025
Как удалить пустые meta-поля в WordPress: эффективные методы и примеры
24.02.2026
Как использовать REST API в WordPress для создания собственных эндпоинтов
08.11.2025