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

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

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

Решение — автоматическое удаление таких заказов через заданный интервал времени, например, через 7 дней после создания, если статус не изменился.

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

Для начала убедитесь, что у вас есть заказы, которые долго находятся в статусах pending, failed или других неактивных.

Используйте SQL-запрос в базе данных WordPress (через phpMyAdmin или WP CLI):

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') ORDER BY post_date ASC;

Если в ответе много заказов старше недели, целесообразно настроить автоматическую очистку.

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

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

function wpdigest_delete_old_inactive_orders() {
    $days = 7; // Количество дней, по прошествии которых заказы удаляются
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => array('wc-pending', 'wc-failed', 'wc-cancelled'),
        'date_query' => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Удаляем заказ без возможности восстановления
        }
    }
}

// Планируем событие при активации темы или плагина
if (!wp_next_scheduled('wpdigest_daily_delete_old_orders')) {
    wp_schedule_event(time(), 'daily', 'wpdigest_daily_delete_old_orders');
}

add_action('wpdigest_daily_delete_old_orders', 'wpdigest_delete_old_inactive_orders');

Объяснение кода:

  • Функция wpdigest_delete_old_inactive_orders ищет заказы с заданными статусами старше 7 дней и удаляет их.
  • Используется планировщик WordPress (wp_schedule_event) для ежедневного запуска очистки.
  • Заказы удаляются без перемещения в корзину (wp_delete_post вторым параметром true).

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

1. Войдите в админку WooCommerce и перейдите в раздел «Заказы».

2. Отфильтруйте заказы по статусам pending, failed, cancelled.

3. Сравните количество заказов до и после запуска кода (через сутки или вручную вызов функции).

4. Для мгновенной проверки можно вручную вызвать функцию в functions.php или через WP-CLI:

wp eval 'wpdigest_delete_old_inactive_orders();'

5. Убедитесь, что старые заказы удалены, а новые — остались.

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

  • Функция не запускается автоматически: Проверьте, что событие запланировано: wp cron event list или плагин WP Crontrol.
  • Удаляются нужные заказы: Проверьте фильтр post_status и период удаления. Можно увеличить количество дней или исключить статусы.
  • Не удаляются заказы: Убедитесь, что функция wp_delete_post вызывается с параметром true для полного удаления, и что у пользователя есть права на удаление.
  • Нагрузка на сайт из-за удаления большого количества заказов: Разбейте обработку на части, например, по 50 заказов за раз.

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

  • Для безопасности убедитесь, что автоматическое удаление происходит только на стороне сервера, без запросов из фронтенда.
  • Используйте wp_schedule_event для запуска в ночное время, чтобы не создавать нагрузку в часы пик.
  • Добавьте логирование удалений в отдельный файл для аудита:
function wpdigest_log_deleted_order($order_id) {
    $log = sprintf("%s - Deleted order ID: %d\n", date('Y-m-d H:i:s'), $order_id);
    error_log($log, 3, WP_CONTENT_DIR . '/logs/order_delete.log');
}

// Внутри цикла удаления заказов добавить:
wpdigest_log_deleted_order($order_id);
  • Если у вас большой магазин, рассмотрите пакетное удаление с лимитом и вызов функции через AJAX CLI для снижения нагрузки.

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

МетодПлюсыМинусы
Плагин (например, WooCommerce Cleanup)Простота установки, готовый функционалЗависимость от стороннего кода, возможные конфликты
Код в functions.php с wp_schedule_eventГибкий, под контролем, можно кастомизироватьТребует навыков, возможные ошибки при неправильной реализации
Ручное удаление через SQLБыстро, без нагрузки на WordPressРиск ошибочного удаления, требует знаний SQL
Как автоматизировать обновление кэшируемых данных в WordPress
24.03.2026
Как автоматизировать удаление старого контента в WordPress: практические решения и примеры кода
31.03.2026
WooCommerce: как автоматически менять цены товаров при смене валюты
07.06.2026
Как установить лимит на количество сообщений в формах WordPress
07.03.2026
Автоматический откат обновлений WordPress при ошибках: практическое решение
23.01.2026