WooCommerce: автоматическое удаление заказов по статусу и срокам с использованием WP-Cron

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

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

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

  • Замедленная админ-панель WooCommerce.
  • Увеличенный размер базы данных по таблицам wp_posts и wp_postmeta.
  • Ручное удаление занимает много времени и чревато ошибками.

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

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

Ниже пример функции, которая удаляет заказы со статусом cancelled и failed, которым больше 30 дней.

function wpfind_delete_old_wc_orders() {
    // Статусы заказов для удаления
    $order_statuses = array('cancelled', 'failed');
    // Срок в днях
    $days = 30;
    
    $args = array(
        'status' => $order_statuses,
        'date_created' => '<' . (new WC_DateTime())->modify('-' . $days . ' days')->format('Y-m-d H:i:s'),
        'limit' => -1,
        'return' => 'ids',
    );
    
    $orders = wc_get_orders($args);
    
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление
        }
    }
}

2. Добавляем WP-Cron задачу для регулярного выполнения

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

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

// Хук для выполнения функции
add_action('wpfind_daily_order_cleanup', 'wpfind_delete_old_wc_orders');

// Очищаем при деактивации
function wpfind_clear_scheduled_order_cleanup() {
    $timestamp = wp_next_scheduled('wpfind_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpfind_daily_order_cleanup');
    }
}

3. Размещение кода

Рекомендуется разместить этот код в functions.php дочерней темы или в отдельном кастомном плагине. Это позволит избежать потери изменений при обновлении темы.

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

Чтобы убедиться, что удаление работает:

  • Создайте тестовый заказ со статусом cancelled или failed и датой создания старше 30 дней (можно через базу данных или с помощью плагина для редактирования даты).
  • Запустите функцию вручную в коде или дождитесь запуска WP-Cron (обычно раз в 24 часа).
  • Проверьте, что заказ удалён из админки WooCommerce и базы данных (wp_posts и wp_postmeta).

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

  • Заказы не удаляются: проверьте, что WP-Cron работает. Для этого используйте плагин WP Crontrol и убедитесь, что задача wpfind_daily_order_cleanup запланирована.
  • Удаляются не те заказы: убедитесь, что в массиве $order_statuses указаны корректные статусы (без префикса wc-).
  • Функция вызывает ошибки: проверьте, что WooCommerce активен и функции wc_get_orders() доступны в момент вызова.
  • Удаление не полное: используйте wp_delete_post($order_id, true) с параметром true для полного удаления с метаданными.

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

  • Не используйте удаление заказов с другими статусами без тщательной проверки — это может повлиять на отчеты и бухгалтерию.
  • Для больших магазинов с тысячами заказов ограничьте количество удаляемых заказов за один запуск, например, добавив параметр 'limit' => 100, чтобы избежать таймаутов.
  • Резервное копирование базы данных обязательно перед внедрением функции удаления.
  • Для улучшения производительности используйте объектный кеш и оптимизируйте базу данных, например, с помощью плагина Clearfy Pro.

Сравнение вариантов реализации

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

Сайт в разработке, скоро здесь будет портал о WordPress.