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

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

С течением времени в WooCommerce накапливаются заказы с разными статусами, включая "ожидает оплаты", "отменён", "в ожидании" и другие. Такие заказы занимают место в базе данных, замедляют выборки и могут влиять на отчёты. Особенно это актуально для магазинов с большим числом заказов и активным трафиком.

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

  • Заказы со статусом cancelled, которым больше 30 дней;
  • Заказы со статусом pending (ожидают оплаты), созданные более 7 дней назад;
  • Заказы с другими статусами, которые не менялись длительное время.

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

wp wc order list --status=pending --date_modified='<2024-01-01'

Это поможет оценить, сколько заказов подлежит удалению.

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

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

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

function wpg_delete_old_woocommerce_orders() {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return;
    }
    // Параметры для выборки неактивных заказов
    $args = array(
        'limit'        => -1, // все подходящие заказы
        'status'       => array('pending', 'cancelled'),
        'date_modified' => '<' . date('Y-m-d', strtotime('-7 days')),
        'return'       => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // удаляем навсегда
    }
}

2. Добавляем автоматическое запускание с помощью WP-Cron

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

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

add_action( 'wpg_daily_delete_old_orders', 'wpg_delete_old_woocommerce_orders' );

3. Очистка расписания при деактивации

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

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

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

1. Подождите запуск Cron-задания (по умолчанию раз в сутки) или вызовите вручную, добавив вызов функции в functions.php и обновив любую страницу сайта.

2. Проверьте базу данных через phpMyAdmin или WP-CLI, что заказы с нужными статусами и датой удаления отсутствуют:

SELECT ID, post_status, post_modified FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending','wc-cancelled') AND post_modified < '2024-01-01';

3. Убедитесь, что отчёты WooCommerce обновились и не содержат удалённые заказы.

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

  • Заказы не удаляются: Проверьте, что WP-Cron у вас работает корректно. Для проверки используйте плагин WP Crontrol или вызовите функцию вручную.
  • Удаляются лишние заказы: Уточните параметры даты и статуса в запросе. Например, используйте date_modified или date_created в соответствии с задачей.
  • Ошибка удаления из-за связей: Убедитесь, что wp_delete_post($order_id, true) вызывается с параметром удаления без корзины (force_delete = true).
  • Проблемы с производительностью при большом количестве заказов: Разбейте удаление на части, используя пагинацию в запросе и крон-задания с меньшим лимитом.

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

  • Перед удалением создавайте резервные копии базы данных, особенно если удаляете заказы массово.
  • Включите логирование действий, чтобы иметь отчёт об удалённых заказах.
  • Используйте транзакции при работе с базой при необходимости.
  • Для крупных магазинов рассмотрите удаление заказов пакетами, например по 100 штук за один запуск, чтобы не перегружать сервер.
  • Обязательно тестируйте скрипты на тестовом стенде перед применением на рабочем сайте.

Сравнение методов удаления неактивных заказов

МетодПлюсыМинусы
Код с WP-CronПолный контроль, нет зависимостей от плагинов, автоматизацияТребует навыков PHP, нужно контролировать работу WP-Cron
Плагины для очистки базыПростота использования, графический интерфейсМогут удалять лишнее, нагрузка при массовом удалении
Ручное удаление через админкуБезопасно, выборочноНе подходит для большого объёма, рутинная работа
Как удалить старые ревизии постов в WordPress без плагинов
25.12.2025
Как создать динамический виджет в WordPress с использованием REST API
15.12.2025
WooCommerce: автоматическое удаление неактивных пользователей по дате последнего заказа
11.05.2026
Как создать персонализированные шорткоды в WordPress
08.11.2025
WooCommerce: автоматическое удаление неактивных вариаций товаров с помощью кода
26.05.2026