Автоматическое удаление неактивных заказов в WooCommerce для оптимизации базы данных

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

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

Как определить, что у вас есть проблема с неактивными заказами:

  • Длительное время отклика при открытии страницы заказов в админке.
  • Замедление работы запросов к таблицам wp_posts и wp_postmeta с типом shop_order.
  • Большое количество заказов с статусами cancelled, failed, pending старше 30 дней.

Проверка количества и возраста заказов по статусам

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;

По результатам запроса можно понять, какие статусы и за какой период накопились в базе.

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

1. Определяем критерии «неактивности» заказов

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

2. Создаём функцию для удаления заказов по заданным условиям

function wproot_delete_old_inactive_orders() {
    global $wpdb;
    $statuses = array('wc-cancelled', 'wc-failed', 'wc-pending');
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ( $statuses 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
        ));

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

3. Настраиваем автоматический запуск через Cron WordPress

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

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

add_action( 'wproot_delete_inactive_orders_cron', 'wproot_delete_old_inactive_orders' );

4. Опционально: добавляем логирование удаления

function wproot_delete_old_inactive_orders() {
    global $wpdb;
    $statuses = array('wc-cancelled', 'wc-failed', 'wc-pending');
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $deleted_count = 0;

    foreach ( $statuses as $status ) {
        $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
        ));

        if ( !empty($order_ids) ) {
            foreach ( $order_ids as $order_id ) {
                if ( wp_delete_post($order_id, true) ) {
                    $deleted_count++;
                }
            }
        }
    }
    error_log("[wproot] Deleted {$deleted_count} inactive WooCommerce orders older than {$days} days.");
}

Как проверить, что автоматическое удаление работает

  • Запустите функцию вручную для теста:
    wproot_delete_old_inactive_orders();
  • Проверьте количество заказов в базе до и после запуска: SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled','wc-failed','wc-pending') AND post_date < NOW() - INTERVAL 30 DAY;
  • Проверьте логи PHP (error_log), если добавлено логирование.
  • Убедитесь, что заказы действительно удалены из админки WooCommerce и базы данных.

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

  • Отсутствие прав на удаление заказов: убедитесь, что скрипт запускается с правами администратора и что функции WordPress доступны.
  • Неправильные статусы заказов: WooCommerce добавляет префикс wc- к статусам, например, wc-cancelled. Проверьте правильность значений.
  • Крон-задачи не запускаются: убедитесь, что WP Cron работает в вашей среде, либо настройте системный cron для вызова wp-cron.php.
  • Удаляются активные заказы: используйте точные критерии по статусу и дате, чтобы не потерять важные данные.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Удаляйте заказы пакетами, если их слишком много, чтобы избежать таймаутов. Например, ограничьте запрос LIMIT 100 и запускайте удаление несколько раз.
  • Логируйте результаты удаления для мониторинга и отладки.
  • Если вы используете плагин Clearfy Pro, там есть инструменты для оптимизации WooCommerce и очистки базы, которые можно дополнить собственным кодом.

Сравнение вариантов решения автоматического удаления заказов

СпособПлюсыМинусы
Ручное удаление через админку WooCommerceПростой, не требует кодаТрудоемко, не подходит для большого количества заказов
Использование плагинов (например, WP Bulk Delete)Удобный интерфейс, опции фильтрацииДополнительная нагрузка, возможные конфликты
Кастомный код с WP Cron (как в статье)Гибко, полностью под контроль, без лишних плагиновНеобходимы навыки разработки, нужно тестировать и поддерживать

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как удалить кэш AJAX в WordPress: практическое руководство
19.03.2026
Как создать собственный REST API endpoint в WordPress: подробное руководство
01.12.2025
WooCommerce: как автоматически удалять старые корзины и неактивные заказы
30.05.2026
Как удалить неиспользуемые метаданные из базы WordPress без плагинов
24.04.2026
Как удалить неиспользуемые метаключи в WooCommerce: практическое руководство
28.04.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙