WooCommerce: автоматическое удаление заказов по статусу и дате с помощью PHP

Проблема: накопление неактивных заказов и замедление базы данных

WooCommerce не предоставляет встроенных средств для удаления заказов по статусу и дате, что приводит к росту базы данных и снижению производительности. Например, отменённые или отложенные заказы могут храниться месяцами, занимая место и замедляя запросы.

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

Для начала определите, сколько заказов определённых статусов и возраста сейчас хранится в базе. Запустите SQL-запрос на базе данных WordPress:

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

Затем проверьте дату создания заказов с нужным статусом:

SELECT ID, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' ORDER BY post_date ASC LIMIT 10;

Это поможет понять, как много старых заказов нужно удалить.

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

Оптимальный способ — создать функцию, которая будет запускаться через WP-Cron и удалять заказы по заданным условиям. Ниже пример кода для удаления заказов со статусом wc-cancelled, созданных более 30 дней назад.

Код для functions.php или отдельного плагина

function wpstudy_delete_old_cancelled_orders() {
    $days = 30; // Кол-во дней для хранения заказов
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => [
            [
                'before' => $date,
                'inclusive' => true,
            ],
        ],
        'posts_per_page' => 50,
        'fields'         => 'ids',
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // Принудительное удаление
        }
    }
}

// Регистрируем событие WP-Cron
if (!wp_next_scheduled('wpstudy_delete_old_cancelled_orders_event')) {
    wp_schedule_event(time(), 'daily', 'wpstudy_delete_old_cancelled_orders_event');
}

// Хук для запуска функции
add_action('wpstudy_delete_old_cancelled_orders_event', 'wpstudy_delete_old_cancelled_orders');

Объяснение

  • Функция ищет заказы со статусом wc-cancelled, старше 30 дней.
  • Удаление происходит пакетами по 50 заказов за раз — это предотвращает перегрузку сервера.
  • WP-Cron запускает функцию ежедневно.

Проверка результата

После активации кода:

  • Проверьте таблицу wp_posts в базе данных на наличие заказов со статусом wc-cancelled старше 30 дней — их должно не остаться.
  • В админке WooCommerce проверьте список заказов с отменённым статусом — старые должны исчезнуть.
  • Для тестирования можно временно уменьшить $days до 1 и создать тестовые заказы с нужным статусом и датой.

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

  • WP-Cron не запускается: по умолчанию WP-Cron срабатывает при посещении сайта. Если на сайте мало трафика, добавьте системный cron, который вызывает wp-cron.php раз в час.
  • Удаление не происходит: проверьте, что функция подключена и событие зарегистрировано. Включите логирование ошибок PHP.
  • Удаляются не те заказы: перепроверьте статус в запросе 'post_status' => 'wc-cancelled' — статус должен соответствовать нужному.
  • Перегрузка сервера: уменьшите posts_per_page с 50 до 10, чтобы снизить нагрузку.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, включая метаданные. Но если требуется архивация, используйте флаг false.
  • Для больших магазинов с сотнями тысяч заказов лучше запускать удаление по частям с ограничениями по времени, чтобы избежать таймаутов.
  • Настройте мониторинг WP-Cron с помощью плагинов типа WP Crontrol, чтобы видеть и управлять задачами.
  • Резервное копирование базы перед массовым удалением — обязательное условие.

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

МетодПлюсыМинусы
Ручное удаление через админку WooCommerceПростота, не требует кодаТрудоёмко, невозможно автоматизировать
SQL-запросы напрямую в базеБыстрое удаление большого объёмаРиск повредить данные, требует опыта
PHP-скрипт с WP-Cron (как в статье)Автоматизация, безопасное удаление, можно настроитьТребует базовых знаний PHP, настройка cron
WooCommerce: автоматическое удаление заказов по статусу и дате
24.04.2026
Удаление неиспользуемых полей в базе данных WordPress для оптимизации
26.01.2026
Как удалить неактивных пользователей в WordPress с помощью PHP
03.04.2026
Как автоматизировать создание бэкапов в WordPress
14.11.2025
Как создать собственный шорткод в WordPress
05.11.2025