WooCommerce: как автоматически удалять старые товары и отсутствующие варианты

Диагностика проблемы с устаревшими товарами и отсутствующими вариантами в WooCommerce

В интернет-магазинах на WooCommerce со временем возникают товары, которые устарели, больше не продаются или имеют варианты, которых фактически нет в наличии или которые неактуальны. Ручное удаление таких товаров и вариантов занимает много времени и чревато ошибками — например, когда забывают очистить связанные данные, что влияет на производительность и качество каталога.

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

Пошаговое решение: автоматизация удаления старых товаров и отсутствующих вариантов

1. Определяем критерии "устаревшего" товара

Для автоматического удаления нужно чётко определить, что считать устаревшим. Чаще всего используют следующие критерии:

  • Дата последнего обновления товара старше определённого периода (например, 180 дней).
  • Статус товара — например, 'черновик' или 'отключен'.
  • Отсутствие продаж за период.
  • Отсутствие остатков на складе (для вариантов).

2. Используем WP-CLI или WP-Cron для регулярного запуска задачи

Для автоматизации на сервере рекомендуется настроить WP-Cron, который будет запускать функцию очистки по расписанию — например, раз в неделю.

3. Пример кода для удаления устаревших товаров и отсутствующих вариантов

Ниже пример простого кода, который можно добавить в functions.php темы или оформить в плагин. Он удаляет товары, обновлённые более 180 дней назад, и варианты с нулевым запасом.

<?php
add_action('wp_loaded', 'auto_delete_old_products_and_variations');
function auto_delete_old_products_and_variations() {
    // Проверяем, что это крона, чтобы не тормозить сайт при обычных запросах
    if (!wp_doing_cron()) {
        return;
    }

    $days = 180; // Период устаревания
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // WP_Query для поиска устаревших товаров (простой пример)
    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'date_query' => [
            [
                'column' => 'post_modified',
                'before' => $date_threshold,
            ],
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $product_id) {
            // Удаляем товар (перемещаем в корзину)
            wp_trash_post($product_id);
        }
    }

    // Удаляем вариации с запасом 0
    $variation_args = [
        'post_type' => 'product_variation',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];

    $variation_query = new WP_Query($variation_args);

    if (!empty($variation_query->posts)) {
        foreach ($variation_query->posts as $variation_id) {
            $stock = get_post_meta($variation_id, '_stock', true);
            $manage_stock = get_post_meta($variation_id, '_manage_stock', true);
            if ($manage_stock === 'yes' && intval($stock) <= 0) {
                wp_trash_post($variation_id);
            }
        }
    }
}

// Запускаем задачу через WP-Cron, например раз в неделю
add_action('wp', function() {
    if (!wp_next_scheduled('weekly_delete_old_products')) {
        wp_schedule_event(time(), 'weekly', 'weekly_delete_old_products');
    }
});

add_action('weekly_delete_old_products', 'auto_delete_old_products_and_variations');
?>

4. Настройка WP-Cron вручную (если нужно)

Для надежности на продакшене лучше настроить системный cron на сервере, чтобы вызывать wp-cron.php. Пример команды для Linux:

wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Добавить в crontab:

0 3 * * 1 wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

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

  • Перейдите в админку WooCommerce > Товары и проверьте, что устаревшие товары перенесены в корзину или удалены.
  • Проверьте, что вариации с нулевым запасом отсутствуют.
  • Запустите cron вручную через WP-CLI (wp cron event run --due-now) и посмотрите логи ошибок.
  • Обратите внимание на производительность сайта — наличие мусора в БД должно уменьшиться.

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

  • Код не запускается автоматически: проверьте, что WP-Cron активен и что событие запланировано (wp cron event list).
  • Удаляются не те товары: уточните критерии в WP_Query, возможно, нужно добавить проверку статуса или категорий.
  • Удаление вариаций не работает: проверьте, что у вариаций корректно заполнены мета-поля _stock и _manage_stock.
  • Функция тормозит сайт: ограничьте количество товаров в запросе, используйте batch-обработку.

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

  • Не удаляйте товары без возможности восстановления — используйте корзину (trash) вместо полного удаления.
  • Используйте WP-CLI для отладки и запуска задач без нагрузки на пользовательский трафик.
  • Ограничьте количество товаров, обрабатываемых за один запуск, чтобы избежать таймаутов.
  • Логируйте удалённые товары и варианты для аудита.

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

МетодПлюсыМинусыПример
Ручное удалениеПростота, контрольДолго, ошибки, трудоемкоЧерез админку WooCommerce
Плагин очистки (например, WP Bulk Delete)Удобный интерфейс, гибкие настройкиНагрузка, зависимость от сторонних решенийClearfy (функции очистки)
Собственный код + WP-CronПолный контроль, автоматизацияНужно тестировать, требует навыковКод из статьи
WooCommerce: как исправить проблему с неотображением цены товара после обновления
31.05.2026
Автоматическое создание резервных копий WordPress: настройка и лучшие плагины
30.11.2025
Как предотвратить дублирование заказов в WooCommerce
01.05.2026
WooCommerce: как автоматически удалять старые товары и отсутствующие варианты
17.06.2026
Как настроить отправку email через SMTP в WordPress: практическое руководство
27.12.2025