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

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

В магазинах на WooCommerce с большим количеством заказов база данных быстро разрастается, что может замедлить работу сайта и увеличить время резервного копирования. Автоматическое удаление завершённых (статус «completed») заказов, которым, например, больше 30 дней, помогает оптимизировать базу, освобождая место и улучшая производительность без ручного участия.

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

Перед автоматизацией важно проверить, что заказы действительно не удаляются вручную и что база не содержит избыточных данных. Иногда заказы могут не удаляться из-за:

  • отсутствия прав на удаление постов;
  • неправильного статуса заказа для фильтрации;
  • конфликтов с плагинами, блокирующими удаление заказов;
  • использования кастомных таблиц или нестандартных статусов.

Для проверки текущих заказов с нужным статусом используйте SQL-запрос:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < NOW() - INTERVAL 30 DAY;

Если записи есть, значит удалять есть что.

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

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

function wpacademy_delete_old_completed_orders() {
    global $wpdb;
    $days = 30; // удалять заказы старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

    if (!empty($order_ids)) {
        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // true для безвозвратного удаления
        }
    }
}

2. Запускаем функцию через WP-Cron раз в сутки

function wpacademy_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpacademy_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpacademy_daily_order_cleanup');
    }
}
add_action('wp', 'wpacademy_schedule_order_cleanup');
add_action('wpacademy_daily_order_cleanup', 'wpacademy_delete_old_completed_orders');

3. Как добавить ручной запуск (для теста)

// Добавьте в functions.php или плагин
if (isset($_GET['delete_old_orders']) && current_user_can('manage_options')) {
    wpacademy_delete_old_completed_orders();
    echo 'Старые завершённые заказы удалены';
    exit;
}

Теперь достаточно перейти на https://example.com/?delete_old_orders=1 (замените example.com на ваш домен) с админской учёткой, чтобы вручную проверить удаление.

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

  • Проверьте в базе данных через phpMyAdmin, что заказы со статусом wc-completed старше 30 дней удалены.
  • Запустите ручной вызов скрипта через GET-параметр и убедитесь в отсутствии ошибок.
  • Проверьте логи сервера на наличие ошибок при выполнении WP-Cron.
  • Убедитесь, что новые заказы не удаляются преждевременно.

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

  • Заказы не удаляются: Проверьте, что функция wp_delete_post() вызывается с параметром true для полного удаления. Убедитесь, что WP-Cron работает (проверьте через плагин WP Crontrol).
  • Удаляются не те заказы: Проверьте корректность даты и статус заказа. Статус должен быть wc-completed, а дата — в формате MySQL.
  • Ошибка доступа при ручном запуске: Убедитесь, что текущий пользователь имеет право manage_options.
  • Конфликты с плагинами: Некоторые плагины безопасности могут блокировать удаление постов. Попробуйте временно отключить их и проверить.

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

  • Не удаляйте заказы слишком быстро — установите разумный порог (например, 30 дней), чтобы сохранить историю.
  • Используйте WP-Cron, но помните, что он зависит от посещаемости сайта. Для надёжности можно настроить системный cron-задание.
  • Регулярно создавайте резервные копии базы перед автоматическим удалением.
  • Добавьте логирование удалённых заказов в отдельный файл для аудита.
  • Оптимизируйте запросы, чтобы не загружать сервер при большом количестве заказов — разбивайте удаление на партии, если нужно.

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

МетодПлюсыМинусы
Удаление вручную через админку WooCommerceПросто, без кодаНеэффективно при большом количестве заказов
Плагин для очистки заказовУдобство, дополнительные настройкиЗависимость от стороннего кода, возможные конфликты
Код на PHP + WP-Cron (текущее решение)Лёгко кастомизировать, автономноНужно контролировать WP-Cron, требует базовых знаний PHP
Как удалить пустые термины таксономий в WordPress
14.03.2026
Как правильно удалить незаконченые заказы WooCommerce через PHP
16.06.2026
Как использовать WPGeneratePress для оптимальной настройки темы WordPress
16.12.2025
Как использовать WP-Cron для автоматизации задач в WordPress
07.05.2026
Как добавить уникальные метаданные для страниц в WordPress без плагинов
21.02.2026