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

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

При большом объёме продаж в WooCommerce таблицы базы данных, связанные с заказами, быстро растут. Отменённые заказы (статус cancelled) часто не несут бизнес-ценности и занимают место, замедляя запросы и операции с базой. Частая проблема — накопление тысяч таких записей, что влияет на производительность сайта и резервное копирование.

Чтобы проверить, сколько отменённых заказов в базе, выполните в базе MySQL запрос (через phpMyAdmin или WP CLI):

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

Если количество превышает несколько тысяч — пора очищать базу.

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

1. Создаём функцию удаления отменённых заказов

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

function wp0_delete_cancelled_orders() {
    global $wpdb;
    // Получаем ID отменённых заказов старше 7 дней
    $order_ids = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < NOW() - INTERVAL 7 DAY"
        )
    );
    if (empty($order_ids)) {
        return;
    }
    foreach ($order_ids as $order_id) {
        wp_trash_post($order_id); // Перемещаем в корзину
    }
}

2. Регистрируем WP-Cron задачу

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

function wp0_schedule_cancelled_orders_cleanup() {
    if (!wp_next_scheduled('wp0_weekly_cancelled_orders_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wp0_weekly_cancelled_orders_cleanup');
    }
}
add_action('wp', 'wp0_schedule_cancelled_orders_cleanup');
add_action('wp0_weekly_cancelled_orders_cleanup', 'wp0_delete_cancelled_orders');

3. Очистка корзины от удалённых заказов

Удалённые заказы попадают в корзину, которая может расти. Добавим удаление из корзины заказов старше 7 дней:

function wp0_empty_cancelled_orders_trash() {
    global $wpdb;
    $order_ids = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'trash' AND post_date < NOW() - INTERVAL 7 DAY"
        )
    );
    if (empty($order_ids)) {
        return;
    }
    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // Удаляем без возможности восстановления
    }
}
add_action('wp0_weekly_cancelled_orders_cleanup', 'wp0_empty_cancelled_orders_trash');

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

  • Запустите вручную функцию wp0_delete_cancelled_orders() через консоль WP CLI (wp eval 'wp0_delete_cancelled_orders();') или вызовите её в админке.
  • Проверьте количество отменённых заказов в базе снова (см. запрос выше) — количество должно уменьшиться.
  • Проверьте, что заказы переместились в корзину и затем были окончательно удалены через неделю.
  • Логи сервера и WooCommerce не должны показывать ошибок, связанных с удалением заказов.

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

  • Отсутствие прав на удаление. Убедитесь, что код выполняется с достаточными правами (обычно в контексте WordPress это не проблема).
  • Неправильный префикс таблицы. В коде используется $wpdb->posts — так динамически берётся префикс базы, не используйте wp_posts напрямую на разных сайтах.
  • WP-Cron не запускается. Если сайт малопосещаемый, WP-Cron может не срабатывать. Рекомендуется настроить системный cron для запуска wp-cron.php или использовать плагины типа WP Crontrol для отладки.
  • Удаляются не те заказы. Проверьте SQL-запросы, убедитесь что статус именно wc-cancelled (WooCommerce добавляет префикс wc- к статусам заказов).

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

  • Не удаляйте заказы сразу, лучше использовать задержку, например 7 дней — это даст время на восстановление ошибочно отменённых заказов.
  • Регулярно оптимизируйте таблицы базы данных с помощью OPTIMIZE TABLE wp_posts; и OPTIMIZE TABLE wp_postmeta; для лучшей производительности.
  • Резервное копирование базы перед внедрением кода — обязательный этап.
  • Для больших магазинов с очень большим объёмом заказов рассмотрите использование специализированных плагинов очистки, например Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wp0.ru&utm_medium=article&utm_campaign=woocommerce-avto-udaleniye-otmenennyh-zakazov), которые умеют более глубоко чистить базу и оптимизировать сайт.

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

МетодПлюсыМинусы
Ручное удаление через SQL-запросыБыстро, без кодаРиск ошибок, требует знаний SQL, не автоматично
Автоматизация через WP-Cron (код)Автоматически, гибко, интегрируется в WordPressЗависит от корректной работы WP-Cron, требует тестирования
Плагины очистки (Clearfy Pro и др.)Простота, дополнительные функции, поддержкаПлатные, могут добавлять нагрузку

Наш каталог плагинов WordPress