wpload.ru wordpress WPLoad.ru

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

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

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

Проверить проблему можно так:

  • В админке WooCommerce перейдите в Заказы и примените фильтр по статусу cancelled или failed.
  • Через phpMyAdmin выполните запрос для подсчёта таких заказов:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed');

Если количество превышает несколько тысяч, стоит автоматизировать их удаление.

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

1. Создаём функцию для удаления заказов старше определённого срока

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

function wpload_delete_old_orders() {
    global $wpdb;
    
    // Указываем статусы заказов для удаления
    $statuses = [ 'wc-cancelled', 'wc-failed', 'wc-pending' ];
    
    // Удаляем только заказы старше 30 дней
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    
    // Формируем SQL запрос для выборки ID заказов
    $placeholders = implode(',', array_fill(0, count($statuses), '%s'));
    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'shop_order' 
           AND post_status IN ($placeholders) 
           AND post_date < %s",
        ...array_merge($statuses, [$date_threshold])
    );
    
    $order_ids = $wpdb->get_col($query);

    if (empty($order_ids)) {
        return; // Нет заказов для удаления
    }

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // Принудительное удаление
    }
}

2. Запускаем функцию по расписанию с помощью WP-Cron

Добавьте в functions.php следующий код для регистрации cron задачи и её запуска раз в сутки:

// Регистрация события при активации темы/плагина
if (! wp_next_scheduled('wpload_daily_delete_orders')) {
    wp_schedule_event(time(), 'daily', 'wpload_daily_delete_orders');
}

// Привязываем функцию к событию
add_action('wpload_daily_delete_orders', 'wpload_delete_old_orders');

// Для отмены cron (при деактивации плагина/темы)
// wp_clear_scheduled_hook('wpload_daily_delete_orders');

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

  • Перейдите в раздел «Заказы» WooCommerce и примените фильтр по статусам cancelled и failed. Количество старых заказов должно уменьшиться после выполнения задачи.
  • Для немедленной проверки можно вручную вызвать функцию в консоли WP-CLI: wp eval 'wpload_delete_old_orders();'
  • Проверьте таблицу wp_posts через phpMyAdmin, чтобы убедиться, что заказы удалены.

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

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

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

  • Используйте wp_delete_post( $order_id, true ) с параметром true для полного удаления, чтобы не оставлять метаданные и данные заказов.
  • Для больших баз данных оптимальнее запускать удаление партиями, чтобы избежать таймаутов. Например, добавьте ограничение на 50 заказов за запуск.
  • Регулярно создавайте резервные копии базы данных перед автоматическим удалением заказов.
  • Если у вас кеширование, очистите кеш после удаления заказов для корректного отображения.

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

  • Определить статусы заказов для удаления (cancelled, failed, pending).
  • Выбрать временной порог для удаления (например, 30 дней).
  • Добавить функцию удаления заказов в functions.php или плагин.
  • Настроить WP-Cron для запуска функции ежедневно.
  • Проверить работоспособность через админку и WP-CLI.
  • Настроить резервное копирование.
  • Обеспечить мониторинг работы cron и ошибок.

Сравнение подходов: плагин vs кастомный код

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

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

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

пишет статьи

готовит SEO

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

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