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

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

Магазины на WooCommerce часто сталкиваются с проблемой накопления большого количества заказов со статусами «отменён», «неоплачен» или «обработан». Это приводит к раздутию базы данных, замедлению админ-панели и неоптимальной работе сайта. Решение — автоматическое удаление заказов по определённым условиям (статусу и времени нахождения в этом статусе).

Чтобы понять, насколько актуальна эта проблема, проверьте количество заказов с нужными статусами в базе данных. Для этого можно выполнить SQL-запрос через phpMyAdmin или WP-CLI:

SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Если количество заказов с статусом wc-cancelled или wc-pending исчисляется тысячами — пора автоматизировать их удаление.

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

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

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

function wpcoder_delete_old_orders() {
    $statuses_to_delete = array('wc-cancelled', 'wc-pending'); // Статусы для удаления
    $days = 30; // Возраст заказа в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ($statuses_to_delete as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => $status,
            'date_query'     => array(
                array(
                    'column' => 'post_date',
                    'before' => $date_threshold,
                ),
            ),
            'posts_per_page' => -1,
            'fields'         => 'ids',
        );

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление
            }
        }
    }
}

2. Настройка wp-cron для регулярного запуска

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

if (!wp_next_scheduled('wpcoder_daily_delete_orders')) {
    wp_schedule_event(time(), 'daily', 'wpcoder_daily_delete_orders');
}

add_action('wpcoder_daily_delete_orders', 'wpcoder_delete_old_orders');

Этот код запускает очистку один раз в сутки. Вы можете изменить периодичность на 'twicedaily' или 'hourly', если нужно.

3. Проверка работы функции вручную

Для немедленной проверки добавьте временный вызов функции (удалите после теста):

add_action('admin_init', function() {
    if (!current_user_can('manage_options')) return;
    wpcoder_delete_old_orders();
});

После захода в админку заказы, подходящие под условия, должны быть удалены.

Как проверить, что удаление сработало

  • Перейдите в WooCommerce → Заказы и проверьте количество заказов с нужными статусами, они должны уменьшиться или исчезнуть.
  • Можно проверить через SQL-запрос (см. раздел диагностики), количество удалённых заказов должно сократиться.
  • Посмотрите логи сайта (если включены), ошибок при удалении не должно быть.

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

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

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

  • Используйте полный wp_delete_post($order_id, true) для удаления заказов из базы, чтобы не оставлять «мусор».
  • Если заказов очень много, разбивайте удаление на части, чтобы избежать таймаутов. Например, в функции добавить ограничение posts_per_page => 100 и запускать несколько раз.
  • Резервное копирование базы перед внедрением автоматического удаления — обязательное условие.
  • Для производительности — отключайте WP-Cron и настраивайте системный cron на сервере, чтобы задачи запускались стабильно.

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, контрольТрудозатратно, риск пропустить старые заказы
Автоматизация через код + WP-CronЭкономит время, регулярно чистит базуТребует настройки, возможны ошибки при некорректном коде
Плагины очистки заказовГотовые решения с UIМогут замедлять сайт, лишние зависимости
Оптимизация базы данных WordPress: как правильно ускорить сайт
23.12.2025
Как создать эффективный кеш в WordPress с помощью перегрузки функций
22.11.2025
Как создать и использовать собственные короткие функции в WordPress
28.01.2026
Как использовать Metabox в WordPress для создания настроек
11.12.2025
Как использовать хук pre_get_posts для фильтрации записей в WordPress
20.04.2026