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

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

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

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

SELECT post_status, COUNT(*) AS count, MAX(post_date) AS last_order_date FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status ORDER BY count DESC;

Если в статусах типа wc-pending, wc-on-hold или wc-processing содержится много заказов старше 30–60 дней, стоит автоматизировать их удаление.

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

1. Создание функции удаления заказов

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

function wc_delete_old_orders() {
    global $wpdb;
    $statuses_to_delete = ['wc-pending', 'wc-on-hold']; // статусы для удаления
    $days_old = 30; // порог возраста заказа в днях

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));

    foreach ($statuses_to_delete as $status) {
        // Получаем ID заказов с нужным статусом и датой
        $order_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            $status, $date_threshold
        ));

        if (!empty($order_ids)) {
            foreach ($order_ids as $order_id) {
                wp_delete_post($order_id, true); // без перемещения в корзину
            }
        }
    }
}

2. Регистрация WP-Cron события

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

function wc_schedule_old_orders_deletion() {
    if (!wp_next_scheduled('wc_delete_old_orders_event')) {
        wp_schedule_event(time(), 'weekly', 'wc_delete_old_orders_event');
    }
}
add_action('wp', 'wc_schedule_old_orders_deletion');

add_action('wc_delete_old_orders_event', 'wc_delete_old_orders');

3. Проверка и удаление расписания при деактивации

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

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

  • Выполните SQL-запрос из раздела диагностики до и после запуска задачи, чтобы убедиться, что старые заказы удалены.
  • Проверьте логи сервера и WooCommerce, чтобы не было ошибок при выполнении WP-Cron.
  • Ручной запуск функции для теста: wc_delete_old_orders(); в консоли WP-CLI или временно через админку.
  • Убедитесь, что важные заказы с другими статусами не затронуты.

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

  • WP-Cron не срабатывает: на хостинге может не работать имитация cron. Проверьте, что посещения сайта запускают WP-Cron, или настройте системный cron для wp-cron.php.
  • Удаляются нужные заказы: неверно указаны статусы. Проверьте статус заказа через админку или функцию wc_get_order_statuses().
  • Отсутствие прав на удаление: функция wp_delete_post вызывается без достаточных прав. Выполняйте код от имени администратора или по cron.
  • Медленное удаление: много заказов удаляется за раз, нагрузка на базу. Можно ограничить количество заказов за один запуск, добавив лимит в SQL-запрос.

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

  • Перед удалением всегда делайте резервные копии базы данных, особенно при работе с заказами.
  • Ограничьте удаление по статусам и возрасту, чтобы случайно не удалить свежие или важные заказы.
  • Для больших магазинов внедрите пакетное удаление с лимитом (например, по 50 заказов за один запуск) и используйте wp_schedule_single_event для повторного запуска.
  • Рассмотрите возможность использования плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpteam.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-neaktivnyh-zakazov-po-srokam) для автоматической чистки базы и оптимизации сайта.

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

МетодПлюсыМинусыРекомендации
Ручное удаление через админкуПростота, контрольТрудозатратно, не автоматичноПодходит для малого количества заказов
SQL-запросы напрямуюБыстро, эффективноРиск ошибок, потеря данныхТолько для опытных разработчиков с бэкапом
Автоматизация через WP-Cron и PHPАвтоматически, гибкая настройкаЗависит от корректной работы WP-CronОптимальный вариант для средних и крупных магазинов
Плагины очистки базыПростота, дополнительные функцииМогут влиять на производительностьИспользовать проверенные решения, например Clearfy Pro
Как создать собственный виджет в WordPress: подробное руководство с примерами кода
01.12.2025
WooCommerce: как автоматически удалять товары из корзины по атрибутам после оплаты
17.05.2026
WooCommerce: как автоматически удалять товары по атрибутам после успешной продажи
11.05.2026
Как отключить автозагрузку изображений в WordPress для ускорения сайта
17.04.2026
Как добавить автоматический удалённый sitemap в WordPress
14.04.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.