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

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

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

Проверить количество отменённых заказов можно через SQL-запрос к базе данных или в админке WooCommerce:

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

Если число велико (сотни и выше), это повод для оптимизации.

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

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

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

function wp0_delete_old_cancelled_orders() {
    global $wpdb;

    $date_threshold = date('Y-m-d H:i:s', strtotime('-7 days'));

    // Получаем ID заказов wc-cancelled старше 7 дней
    $orders_to_delete = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < %s",
        $date_threshold
    ));

    if (empty($orders_to_delete)) {
        return;
    }

    foreach ($orders_to_delete as $order_id) {
        wp_delete_post($order_id, true); // true - удаление без перемещения в корзину
    }
}

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

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

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

add_action('wp0_daily_cancelled_orders_cleanup', 'wp0_delete_old_cancelled_orders');

3. Очистка при деактивации темы или плагина

Чтобы избежать мусора в WP-Cron, удалим расписание при деактивации:

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

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

  • Перед запуском проверьте количество отменённых заказов через SQL или в WooCommerce.
  • Запустите функцию вручную, вызвав wp0_delete_old_cancelled_orders() через консоль WP-CLI или временно добавьте вызов в код для теста.
  • Проверьте, что отменённые заказы старше 7 дней исчезли.
  • Наблюдайте через день – должна включиться автоматическая очистка.

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

  • Функция не запускается автоматически: Убедитесь, что WP-Cron работает (например, посетите сайт – это запускает cron). Для проверки можно установить плагин Query Monitor и посмотреть cron-события.
  • Удаляются не те заказы: Проверьте правильность статуса wc-cancelled и условий даты.
  • Проблемы с правами доступа к базе: Убедитесь, что пользователь базы данных имеет права на удаление записей.
  • Накопление мета-данных: wp_delete_post() удаляет мета, но если используете сторонние плагины – проверьте, нет ли лишних данных.

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

  • Не удаляйте заказы слишком быстро – оставляйте запас времени (7 дней и более), чтобы не потерять полезные данные.
  • Используйте WP-CLI для массовой очистки при больших объёмах данных, чтобы избежать таймаутов.
  • Резервное копирование базы перед автоматическим удалением обязательно.
  • Оптимизируйте базу после удаления – командой SQL OPTIMIZE TABLE wp_posts; или с помощью плагинов.

Сравнение способов автоматической очистки отменённых заказов

СпособПлюсыМинусы
WP-Cron с функцией удаления Автоматизация, гибкость, не требует сторонних плагинов Зависит от посещаемости сайта, возможны задержки
Плагин для очистки заказов Простота настройки, дополнительные функции Дополнительная нагрузка, возможные конфликты
Ручной SQL-запрос Мгновенный эффект, полный контроль Риск ошибок, требует технических знаний

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