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

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

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

Пошаговое решение: удаление заказов по статусу и дате через WP-Cron и кастомный код

1. Подготовка: выбор статусов и периода удаления

Определите, какие статусы заказов нужно удалять. Например, cancelled, failed. Установите минимальный возраст заказа, например, 30 дней.

2. Добавление функции удаления заказов в functions.php

Ниже пример кода, который выполняет удаление заказов с выбранными статусами старше указанного периода.

function wpfront_delete_old_woocommerce_orders() {
    $statuses_to_delete = array('cancelled', 'failed');
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => array_map(function($status) { return 'wc-' . $status; }, $statuses_to_delete),
        'date_query' => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
        'no_found_rows' => true
    );

    $query = new WP_Query($args);

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

3. Автоматизация: добавление задачи в WP-Cron

Чтобы запускать удаление автоматически, добавим WP-Cron задачу. Например, раз в неделю.

function wpfront_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpfront_weekly_order_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpfront_weekly_order_cleanup');
    }
}
add_action('wp', 'wpfront_schedule_order_cleanup');

add_action('wpfront_weekly_order_cleanup', 'wpfront_delete_old_woocommerce_orders');

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

Чтобы проверить работоспособность:

  • Создайте тестовые заказы с нужными статусами и датой старше 30 дней (через базу или программно).
  • Запустите функцию вручную из админки или через CLI WP-CLI:
wp eval 'wpfront_delete_old_woocommerce_orders();'
  • Проверьте, что заказы удалены: в админке WooCommerce они пропали, а в базе (таблица wp_posts) соответствующие записи удалены.

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

  • Заказы не удаляются: Убедитесь, что статусы указаны корректно с префиксом wc- в запросе. Проверьте, что WP-Cron работает (например, через плагин WP Crontrol).
  • Удаление происходит не полностью или заказы остаются: Возможно, включен режим корзины удаления (trash), тогда используйте параметр wp_delete_post($order_id, true); для безвозвратного удаления.
  • Потеря данных: Перед автоматическим удалением сделайте резервную копию БД. Убедитесь, что удаляете только ненужные статусы и только старые заказы.
  • Большая нагрузка при удалении: Если заказов много, разбейте удаление на части с пагинацией (например, по 50 заказов за один запуск), чтобы избежать перегрузки сервера.

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

  • Всегда делайте резервное копирование базы перед любыми массовыми операциями.
  • Для крупных магазинов рекомендуется запускать удаление в ночное время с помощью WP-Cron или системного cron через WP-CLI, чтобы снизить нагрузку.
  • Используйте плагины кеширования и базу данных с оптимизацией, чтобы ускорить работу после удаления.
  • Если хотите более гибкий подход с интерфейсом, рассмотрите плагины для массового удаления заказов, например, «Advanced Order Export For WooCommerce», но код дает полный контроль без сторонних зависимостей.

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

МетодПлюсыМинусыКогда использовать
Код + WP-CronПолный контроль, автоматизация, без сторонних плагиновТребует базовых навыков, нужно тестироватьМагазины с программными задачами, разработчики
Плагины массового удаленияУдобный интерфейс, простота использованияМожет нагружать сайт, зависит от плагинаДля пользователей без навыков программирования
Удаление вручную из админкиПростота, доступно сразуМного времени при большом объеме, риск ошибокМаленькие магазины, редкие удаления
Как удалить старые ревизии постов в WordPress из базы данных
26.01.2026
Автоматическое удаление неиспользуемых плагинов WordPress
23.03.2026
WooCommerce: как автоматически отправлять кастомные сообщения при изменении статуса заказа
29.05.2026
Как создать автоматический импорт постов из RSS в WordPress
30.03.2026
Как использовать REST API в WordPress для создания собственных настроек
25.11.2025