WooCommerce: как автоматически удалять заказы старше 30 дней

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

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

Автоматическое удаление заказов старше определенного срока (например, 30 дней) помогает поддерживать базу в оптимальном состоянии без ручного вмешательства.

Особенности удаления заказов в WooCommerce

Заказы в WooCommerce — это записи типа shop_order в таблице wp_posts с метаданными в wp_postmeta и связанными данными (например, записи в wp_woocommerce_order_items и wp_woocommerce_order_itemmeta).

Простое удаление записи поста через стандартный WP-функционал не очистит связанные таблицы, что приведет к мусору в базе. Поэтому важно использовать функции WooCommerce или WordPress, которые корректно удаляют все связанные с заказом данные.

Пошаговое решение: автоматическое удаление заказов старше 30 дней

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

function wpco_delete_old_wc_orders() {
    // Получаем дату 30 дней назад
    $date = date('Y-m-d H:i:s', strtotime('-30 days'));

    // Параметры запроса для получения заказов старше 30 дней
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array_keys(wc_get_order_statuses()),
        'date_query'     => array(
            array(
                'before' => $date,
            ),
        ),
        'posts_per_page' => 50, // ограничение на партию
        'fields'         => 'ids',
    );

    $old_orders = get_posts($args);

    if (empty($old_orders)) {
        return;
    }

    foreach ($old_orders as $order_id) {
        // Получаем объект заказа
        $order = wc_get_order($order_id);
        if ($order) {
            // Удаляем заказ полностью
            wp_delete_post($order_id, true); // true для безвозвратного удаления
        }
    }
}

2. Автоматизируем запуск функции с помощью WP-Cron

Добавьте хук для запуска функции ежедневно, например, в 3 часа ночи:

add_action('wpco_daily_delete_old_orders', 'wpco_delete_old_wc_orders');

// Регистрируем событие, если его еще нет
if (!wp_next_scheduled('wpco_daily_delete_old_orders')) {
    wp_schedule_event(strtotime('03:00:00'), 'daily', 'wpco_daily_delete_old_orders');
}

3. Добавляем очистку расписания при деактивации темы или плагина

function wpco_clear_scheduled_delete() {
    $timestamp = wp_next_scheduled('wpco_daily_delete_old_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpco_daily_delete_old_orders');
    }
}
// Например, при деактивации плагина
register_deactivation_hook(__FILE__, 'wpco_clear_scheduled_delete');

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

  • В базе данных wp_posts не должно быть заказов с датой создания старше 30 дней.
  • Связанные метаданные и записи из WooCommerce должны быть удалены (проверьте таблицы wp_postmeta, wp_woocommerce_order_items и wp_woocommerce_order_itemmeta).
  • В админке WooCommerce должны отсутствовать заказы старше 30 дней.
  • Логируйте удаляемые ID заказов при разработке, чтобы убедиться в корректности работы.

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

1. Заказы не удаляются

  • Ошибка в расписании WP-Cron: проверьте, срабатывает ли событие — используйте плагин WP Crontrol.
  • Неправильный формат даты в запросе — дата должна быть в формате Y-m-d H:i:s.

2. Удаляются не все связанные данные

  • Используйте wp_delete_post($order_id, true), чтобы вызвать все хуки WooCommerce для очистки.

3. Высокая нагрузка при удалении большого количества заказов

  • Ограничьте количество заказов, удаляемых за один запуск (например, 50).
  • Если заказов много, WP-Cron будет вызывать функцию несколько раз в разные дни.

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

  • Перед внедрением на живом сайте сделайте полный бэкап базы данных.
  • Для мониторинга успешных удалений можно добавить логирование в файл или в таблицу.
  • Если на сайте очень много заказов, рассмотрите удаление партиями с промежутками.
  • По возможности отключайте WP-Cron и используйте системный cron для более надежного выполнения задач.

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

МетодПреимуществаНедостатки
WP-Cron + код на PHPГибкость, без сторонних плагинов, можно кастомизироватьЗависит от трафика сайта, возможна задержка выполнения
Плагины для очистки WooCommerceПростая установка, готовый интерфейсМогут грузить базу, возможны лишние функции, не всегда оптимальны
Системный cron + WP-CLIНадежность, быстрое выполнениеТребует доступа к серверу, знания командной строки

Дополнительный пример: удаление заказов с помощью WP-CLI

wp post delete $(wp post list --post_type=shop_order --date_query='before=30 days ago' --format=ids) --force

Эта команда удалит все заказы старше 30 дней безвозвратно. Запускайте вручную или в cron на сервере.

Как создать автоматическую публикацию постов из внешнего источника в WordPress
08.04.2026
Как отображать последних активных пользователей WordPress
25.01.2026
Как автоматизировать удаление старого контента в WordPress
08.02.2026
Как отладить и исправить ошибки в плагинах WordPress
18.12.2025
Как удалить пустые термины в WordPress: эффективные методы и примеры кода
16.03.2026