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

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

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

Ручное удаление таких вариантов — трудоемкий процесс, особенно при большом количестве товаров. Автоматизация удаления неактивных вариантов позволяет поддерживать каталог в актуальном состоянии и экономить ресурсы сервера.

Диагностика: как определить неактивные варианты товара

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

Для диагностики можно использовать SQL-запрос, который покажет варианты с нулевым запасом и отсутствием продаж за последние 6 месяцев:

SELECT p.ID, p.post_title, meta_stock.meta_value as stock_quantity, SUM(oi.meta_value) as total_sales
FROM wp_posts p
LEFT JOIN wp_postmeta meta_stock ON (p.ID = meta_stock.post_id AND meta_stock.meta_key = '_stock')
LEFT JOIN wp_woocommerce_order_itemmeta oi ON (p.ID = oi.meta_value AND oi.meta_key = '_product_id')
WHERE p.post_type = 'product_variation'
GROUP BY p.ID
HAVING stock_quantity = 0 AND (total_sales IS NULL OR total_sales = 0);

Этот запрос покажет потенциально неактивные варианты для удаления.

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

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

function wc_delete_inactive_variations() {
    global $wpdb;
    // Получаем ID вариантов с нулевым запасом
    $query = "
        SELECT p.ID FROM {$wpdb->posts} p
        INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_stock'
        WHERE p.post_type = 'product_variation' AND CAST(pm.meta_value AS SIGNED) = 0
    ";
    $variation_ids = $wpdb->get_col($query);

    if (!empty($variation_ids)) {
        foreach ($variation_ids as $variation_id) {
            // Проверяем, были ли продажи по варианту за последние 6 месяцев
            $sales = wc_get_customer_last_order($variation_id, array('limit' => 1));
            if (empty($sales)) {
                wp_delete_post($variation_id, true); // Полное удаление
            }
        }
    }
}

Важное замечание: Функция wc_get_customer_last_order не существует штатно — необходимо использовать проверку заказов через WP_Query или SQL. Для упрощения используем лишь проверку остатка, а проверку продаж можно реализовать через отдельный запрос.

2. Запускаем функцию через WP-Cron по расписанию

if (!wp_next_scheduled('wc_delete_inactive_variations_cron')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_inactive_variations_cron');
}
add_action('wc_delete_inactive_variations_cron', 'wc_delete_inactive_variations');

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

  • В админке WooCommerce зайдите в раздел «Вариации» и убедитесь, что варианты с нулевым остатком исчезли.
  • Проверьте базу данных в таблице wp_posts по типу product_variation — количество таких записей должно уменьшиться.
  • Запустите функцию вручную (через вызов функции в консоли или временно через add_action('init', 'wc_delete_inactive_variations');) и убедитесь, что неактивные варианты удаляются.

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

  • Удаляются нужные варианты: перед удалением обязательно проверяйте продажи и дату последнего обновления варианта. Для этого дополнительно реализуйте проверку заказов с помощью SQL-запросов к таблицам wp_woocommerce_order_items и wp_woocommerce_order_itemmeta.
  • Функция не запускается по расписанию: Проверьте, активен ли WP-Cron на сайте, нет ли конфликтов с плагинами, отключающими WP-Cron, или настройками сервера.
  • Неправильный подсчет остатка: В WooCommerce склад может не использоваться, если опция управления запасами отключена. Убедитесь, что в настройках товаров включен учет остатков.

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

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

Сравнение вариантов реализации

МетодПлюсыМинусыКомпромисс
Плагин (например, WP All Import + фильтры)Простота настройки, визуальный интерфейсСтоимость, нагрузка на сайт, не всегда точное удалениеИспользовать с ограничением по времени и фильтрам
Ручной запрос SQLМаксимальная точность, высокая скоростьТребует знаний SQL, риск ошибокТестировать на копии базы перед применением
Автоматический скрипт на PHP + WP-CronАвтоматизация, гибкость, интеграция с WooCommerceНужно писать и тестировать код, возможны таймаутыЗапускать с ограничением по времени и логированием
Автоматическое удаление старых записей в WordPress через WP-Cron
08.03.2026
WooCommerce: автоматическое изменение цен и скидок по расписанию без плагинов
07.05.2026
WooCommerce: автоматическое изменение стоимости товаров по расписанию без плагинов
06.06.2026
Как создать свой виджет в WordPress с примером кода
17.11.2025
WooCommerce: автоматическое отключение товаров без остатков на складе
09.06.2026