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

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

В WooCommerce на сайтах с большим ассортиментом часто накапливаются вариации товаров, которые больше не актуальны: устаревшие цвета, размеры или комплектации, которые не продаются и не нужны в каталоге. Они создают нагрузку на базу данных, ухудшают юзабилити и SEO. Ручное удаление каждой вариации занимает много времени, а стандартных функций для массового удаления по фильтрам в админке нет.

Типичная диагностика включает:

  • Проверку наличия вариаций без остатков на складе.
  • Поиск вариаций, которые не продаются длительное время (например, без заказов за 6 месяцев).
  • Выявление вариаций с меткой «неактивный» или статусом, отличным от "publish".

Для анализа можно использовать SQL-запросы к базе данных, например, чтобы найти варианты без остатков:

SELECT posts.ID, posts.post_title, pm.meta_value as stock_qty FROM wp_posts posts JOIN wp_postmeta pm ON posts.ID = pm.post_id WHERE posts.post_type = 'product_variation' AND pm.meta_key = '_stock' AND pm.meta_value = '0';

Пошаговое решение: автоматическое удаление неактивных вариантов по расписанию

1. Критерии отбора неактивных вариантов

Для автоматического удаления нужно определить четкие критерии. Например:

  • Вариации с остатком на складе 0.
  • Вариации, которые не продавались в последние 180 дней.
  • Вариации со статусом "publish".

2. Создание WP-Cron задачи

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

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

add_action('delete_inactive_variations_daily', 'delete_inactive_variations');

function delete_inactive_variations() {
    global $wpdb;

    // Получаем вариации с нулевым остатком
    $variations = $wpdb->get_results(
        "SELECT p.ID FROM {$wpdb->posts} p
        JOIN {$wpdb->postmeta} pm_stock ON p.ID = pm_stock.post_id AND pm_stock.meta_key = '_stock'
        WHERE p.post_type = 'product_variation'
          AND pm_stock.meta_value = '0'"
    );

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

    foreach ($variations as $variation) {
        // Проверяем дату последней продажи
        $last_order_date = get_post_meta($variation->ID, '_last_order_date', true);
        if (!$last_order_date) {
            // Если нет данных о продажах, считаем вариацию кандидатной на удаление
            wp_delete_post($variation->ID, true);
            continue;
        }

        $days_since_last_order = (time() - strtotime($last_order_date)) / DAY_IN_SECONDS;
        if ($days_since_last_order > 180) {
            wp_delete_post($variation->ID, true);
        }
    }
}

Важно: для работы условия с датой последней продажи должен быть механизм записи даты последнего заказа вариации. Если его нет, можно упростить логику, удаляя все вариации с остатком 0.

3. Обновление даты последней продажи вариации

Добавим хук для обновления метаданных при заказе:

add_action('woocommerce_order_status_completed', 'update_variation_last_order_date');
function update_variation_last_order_date($order_id) {
    $order = wc_get_order($order_id);
    foreach ($order->get_items() as $item) {
        $product_id = $item->get_variation_id();
        if ($product_id) {
            update_post_meta($product_id, '_last_order_date', current_time('mysql'));
        }
    }
}

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

Чтобы убедиться, что задача работает корректно:

  • Запустите WP-Cron вручную через плагин WP Crontrol или временно замените расписание на раз в минуту.
  • Проверьте, что вариации с нулевым остатком, у которых дата последней продажи старше 180 дней, удалились из базы (через админку или SQL-запрос).
  • Просмотрите логи ошибок сервера и WordPress для выявления сбоев.

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

  • Задача WP-Cron не выполняется: часто на хостинге нет реального cron, поэтому задачи не запускаются автоматически. Решение — настроить системный cron на вызов wp-cron.php или запускать вручную.
  • Удаление вариаций, которые нужны: если критерии отбора слишком широкие, можно потерять нужные варианты. Обязательно тестируйте на тестовом сайте и используйте резервные копии.
  • Отсутствие данных о дате последней продажи: без правильной записи этой даты скрипт не сможет корректно фильтровать варианты. Добавьте обработку в хуки заказа, как указано выше.
  • Ошибка прав доступа при удалении: убедитесь, что код выполняется с правами администратора и в правильном контексте WordPress.

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

  • Выполняйте удаление партиями, если много вариаций — это снизит нагрузку. Например, ограничьте запрос 50 вариантами за раз.
  • Добавьте логирование удалений в отдельный файл для аудита и восстановления.
  • Перед удалением делайте резервное копирование базы данных.
  • Используйте транзиенты или кэш для хранения результатов сложных запросов, чтобы не перегружать базу.

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

МетодПлюсыМинусыПример кода/плагина
Ручное удаление через админкуПростота, полный контрольДолго, неудобно при большом количестве—
Использование WP-Cron и пользовательского кодаАвтоматизация, гибкостьНужны навыки программирования, риск ошибокКод из статьи
Плагины для очистки WooCommerceГотовое решение, интерфейсЗависимость от стороннего кода, возможные конфликтыWPShop Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpbuy.ru&utm_medium=article&utm_campaign=woocommerce-udalit-neaktivnye-varianti-tovarov-po-raspisaniyu-bez-plaginov)
Как использовать Transients API для кэширования в WordPress: практические примеры и решения
29.09.2026
WooCommerce: автоматическое обновление остатков и вариантов товаров по расписанию
02.10.2026
WooCommerce: автоматическое изменение стоимости товаров по расписанию без плагинов
20.09.2026
Как добавить автоматическое сохранение данных в формах WordPress
28.09.2026
WooCommerce: как автоматически удалять неактивные варианты товаров
22.09.2026
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »