wpdebug.ru wordpress WP Debug

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

Почему важно удалять отменённые и отложенные заказы в WooCommerce

С течением времени в базе WooCommerce накапливаются заказы со статусами cancelled (отменён) и on-hold (отложен). Они не участвуют в продажах, но занимают место в базе данных, замедляют запросы и могут влиять на резервное копирование и производительность сайта. Автоматическое удаление таких заказов позволяет поддерживать базу в актуальном состоянии без необходимости ручной очистки.

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

  • Проверьте количество заказов с нужными статусами через SQL:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-on-hold') GROUP BY post_status;
  • Если количество отменённых и отложенных заказов превышает несколько тысяч, стоит задуматься об автоматизации очистки.
  • Замедленная работа админки при просмотре заказов и отчётов — косвенный признак.

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

Для автоматического удаления отменённых и отложенных заказов можно использовать WP-Cron и кастомную функцию. Ниже пример, который удаляет такие заказы старше 30 дней.

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

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

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-on-hold'],
        'date_query'     => [
            [
                'before'    => $date,
                'inclusive' => true,
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — удалить без перемещения в корзину
        }
    }
}

2. Регистрируем WP-Cron для запуска задачи раз в день

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

add_action('wpdebug_daily_order_cleanup', 'wpdebug_delete_old_cancelled_onhold_orders');

3. Очистка при деактивации плагина (если код в плагине)

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

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

  • Запустите функцию вручную для теста, заменив wpdebug_delete_old_cancelled_onhold_orders() вызовом из консоли WP-CLI или в файле темплейта.
  • Проверьте, что заказы со статусами wc-cancelled и wc-on-hold старше 30 дней действительно удалились.
  • Через 24 часа убедитесь, что WP-Cron сработал автоматически (логи или плагин WP Crontrol помогут).
  • Проверьте производительность панели заказов и размер таблицы wp_posts до и после удаления.

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

  • Заказы не удаляются: убедитесь, что WP-Cron работает — иногда при низкой посещаемости сайта события не срабатывают. Проверьте плагин WP Crontrol.
  • Удаляются нужные заказы: внимательно настройте параметры post_status и date_query, чтобы не удалить активные или недавно созданные заказы.
  • Производительность падает при удалении большого количества заказов: разбейте удаление на партии с помощью пагинации в запросе, например, по 100 заказов за раз.

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

  • Резервное копирование: перед автоматическим удалением убедитесь, что регулярно делаете бэкапы базы данных.
  • Логирование: добавьте запись в лог при каждом запуске функции, чтобы отслеживать удалённые заказы.
  • Оптимизация запросов: при большом количестве заказов используйте WP_Query с пагинацией, чтобы избежать таймаутов.
  • Использование плагинов: если не хотите писать код, рассмотрите Clearfy Pro (ссылка) — он умеет чистить базу и удалять неактивные данные.

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

МетодПлюсыМинусыКогда использовать
Код с WP-CronПолный контроль, бесплатно, гибкая настройкаТребует навыков, зависит от WP-CronПри желании кастомной логики, контроле над процессом
Плагин (например, Clearfy Pro)Простота, готовый функционал, поддержкаПлатно, меньше гибкостиДля быстрой настройки и поддержки без кода
Ручное удаление SQL-запросомМгновенно, без WP-CronРиск ошибок, требует бэкапа, нет автоматизацииОдноразовая чистка при больших объёмах
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше