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

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

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

Как определить, какие заказы подлежат удалению

Чаще всего удаляют заказы со статусом cancelled, failed и pending, которые старше определённого времени (например, 30 дней). Важно не трогать завершённые (completed) и обрабатываемые (processing) заказы.

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

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

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

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

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

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

function wpkey_delete_old_woocommerce_orders() {
    $days = 30; // Время хранения заказов в днях
    $statuses_to_delete = [
        'wc-cancelled',
        'wc-failed',
        'wc-pending'
    ];

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => $statuses_to_delete,
        'date_query'     => [
            [
                'before' => $date_threshold,
                'inclusive' => true,
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $old_orders = get_posts($args);

    foreach ($old_orders as $order_id) {
        wp_delete_post($order_id, true); // true - удаляет без перемещения в корзину
    }
}

2. Автоматический запуск через WP-Cron

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

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

add_action('wpkey_daily_delete_old_orders', 'wpkey_delete_old_woocommerce_orders');

Этот код запускает очистку заказов один раз в сутки.

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

  • Выполните SQL-запрос из раздела диагностики до и после запуска функции, чтобы проверить, что старые заказы удаляются.
  • При необходимости временно вызовите функцию вручную, вызвав wpkey_delete_old_woocommerce_orders() в админке через плагин Code Snippets или временный код.
  • Проверьте логи ошибок сервера и WooCommerce на предмет конфликтов.

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

  • Функция не запускается по расписанию: Убедитесь, что на сайте не отключен WP-Cron (проверьте DISABLE_WP_CRON в wp-config.php).
  • Удаляются важные заказы: Проверьте, что статусы в массиве $statuses_to_delete указаны корректно и не включают wc-completed или другие важные.
  • Производительность падает: При большом количестве заказов разбейте удаление на части с помощью пагинации и set_time_limit.

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

  • Всегда делайте резервное копирование базы данных перед внедрением автоматического удаления.
  • Добавьте логирование удалённых заказов для контроля (например, через error_log или отдельную таблицу).
  • Не удаляйте заказы сразу, если интегрированы сторонние сервисы — сначала проверьте их обработку.
  • Для сайтов с большим трафиком рассмотрите использование wp-cli скриптов для запуска очистки вне WP-Cron.
  • Регулярно оптимизируйте таблицы базы данных после массовых удалений.

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

МетодПреимуществаНедостатки
WP-Cron + PHP (как в статье)Автоматизация, гибкость, легко настраиваетсяЗависит от посещаемости сайта, может не сработать вовремя
wp-cli скриптНезависим от WP-Cron, подходит для больших сайтовТребует доступа к серверу, не для новичков
Плагины очистки базыУдобный UI, дополнительные функцииМогут быть избыточны или конфликтовать с другими плагинами
Как запустить WordPress без PHP: практическое руководство по Headless CMS
21.03.2026
Как кастомизировать страницу входа в WordPress без плагинов
19.01.2026
Как автоматизировать удаление старых комментариев в WordPress
09.04.2026
Как добавить пользовательские роли в WordPress с поддержкой AJAX
18.12.2025
Как удалить старые неиспользуемые опции в WordPress
15.04.2026

Ресурс в разработке, скоро здесь будет сайт по вордпресс