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

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

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

Как автоматизировать удаление старых товаров и заказов через код

1. Удаление товаров по дате последнего обновления

Для очистки товаров, которые не обновлялись, например, более 180 дней, используйте WP Cron для запуска регулярной задачи. В задаче пишем запрос, который получает ID товаров, и с помощью функции wp_delete_post() удаляем их вместе с метаданными.

function wc_auto_delete_old_products() {
    $args = [
        'post_type'      => 'product',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'column' => 'post_modified_gmt',
                'before' => '180 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $old_products = get_posts($args);

    foreach ($old_products as $product_id) {
        wp_delete_post($product_id, true); // true – безвозвратное удаление
    }
}
add_action('wc_daily_cleanup_hook', 'wc_auto_delete_old_products');

// Регистрируем ежедневное событие при активации темы или плагина
if (!wp_next_scheduled('wc_daily_cleanup_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_daily_cleanup_hook');
}

2. Автоматическое удаление заказов по статусу и дате

Заказы WooCommerce – это кастомный тип записи shop_order. Чтобы удалять, например, отменённые заказы старше 30 дней, используем похожий подход.

function wc_auto_delete_old_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled'],
        'date_query'     => [
            [
                'column' => 'post_date_gmt',
                'before' => '30 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $old_orders = get_posts($args);

    foreach ($old_orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}
add_action('wc_daily_cleanup_hook', 'wc_auto_delete_old_orders');

Пошаговое решение: как внедрить код в WooCommerce

  1. Добавьте оба куска кода в файл functions.php активной дочерней темы или создайте небольшой плагин для кастомных функций.
  2. Убедитесь, что крон-событие wc_daily_cleanup_hook зарегистрировано и запускается (можно проверить WP-Cron с плагином WP Crontrol).
  3. Запустите крон вручную через WP Crontrol или дождитесь автоматического запуска для проверки удаления.
  4. Проверьте базу данных через phpMyAdmin: записи старых товаров и заказов должны быть удалены.

Как проверить, что удаление работает

  • Перед применением сделайте резервную копию базы данных.
  • Создайте тестовый товар с датой изменения более 180 дней назад (можно вручную изменить поле post_modified_gmt в базе).
  • Создайте тестовый заказ со статусом wc-cancelled и датой старше 30 дней.
  • Запустите крон-событие вручную или дождитесь его срабатывания.
  • Проверьте, что тестовые записи удалены.
  • Проверьте логи сервера на ошибки, если удаление не происходит.

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

  • Крон-событие не запускается. Решение: убедитесь, что WP-Cron работает, используйте плагин WP Crontrol для диагностики.
  • Удаление не происходит из-за прав доступа. Убедитесь, что текущий пользователь имеет права на удаление записей, код работает на уровне сервера.
  • Удаляются не те записи. Проверьте параметры post_type и post_status в запросах.
  • Производительность падает при большом количестве записей. Разбейте удаление на небольшие партии, например, по 50 записей за один запуск, используя параметр posts_per_page.
  • Удаление не учитывает вариативные товары. В WooCommerce вариативные товары — это дочерние посты с типом product_variation. Если нужно, добавьте отдельный запрос для удаления вариаций.

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

  • Перед удалением всегда создавайте резервные копии базы (например, с помощью плагина UpdraftPlus или вручную).
  • Для больших магазинов разбивайте удаление на пакеты и запускайте по крону с интервалами, чтобы избежать таймаутов.
  • Используйте транзакции базы данных, если пишете более сложную логику на SQL.
  • Для контроля логируйте удалённые ID в отдельный файл или таблицу для аудита.
  • Регулярно проверяйте состояние вашего WP-Cron и при необходимости переключайтесь на системный cron вместо WP-Cron для лучшей надёжности.

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

СпособПлюсыМинусыКогда применять
Ручное удаление через админку Просто, не требует кода Неэффективно для большого количества записей Маленькие магазины, единичные удаления
Плагины очистки базы (например, WP Sweep) Готовое решение, интерфейс Могут удалять лишнее, нагрузка на сервер Средние магазины, при регулярной чистке
Кастомный код и WP-Cron (описанный способ) Гибко, подстраивается под задачи, автоматизация Требует навыков, потенциальные ошибки при реализации Крупные магазины и проекты с уникальными требованиями
WooCommerce: автоматическое удаление закрытых отзывов по времени
07.06.2026
WooCommerce: автоматическое удаление заказов по статусу и времени через код
02.07.2026
Как создать настройку в плагине WordPress для управления оптимизацией изображений
02.03.2026
Диагностика и решение проблем PHP Fatal Error в WordPress
09.01.2026
Как изменить URL автора в WordPress без изменения ссылок постов
05.12.2025