WooCommerce: автоматическое отключение неактивных вариаций товаров

Почему важно отключать неактивные вариации в WooCommerce

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

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

Под неактивными вариациями понимаются те, которые не продаются, не обновлялись длительное время или находятся в статусе «черновик» или «отключено». Для диагностики можно:

  • Проверить дату последнего заказа с конкретной вариацией.
  • Анализировать статус вариации (publish/draft/private).
  • Смотреть наличие остатков на складе (stock).

Для быстрого анализа можно использовать SQL-запрос:

SELECT p.ID, p.post_title, pm.meta_value AS stock_quantity
FROM wp_posts p
LEFT JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_stock'
WHERE p.post_type = 'product_variation'
AND p.post_status = 'publish'
AND (pm.meta_value IS NULL OR pm.meta_value = '0');

Этот запрос выводит вариации с нулевым или отсутствующим запасом, которые могут считаться неактивными.

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

Для автоматизации отключения вариаций с нулевым запасом используем хук woocommerce_product_set_stock, который срабатывает при обновлении запасов.

add_action('woocommerce_product_set_stock', 'auto_disable_inactive_variations', 10, 1);
function auto_disable_inactive_variations($product) {
    if (!$product->is_type('variation')) {
        return;
    }
    $stock_quantity = $product->get_stock_quantity();
    if ($stock_quantity === 0) {
        $variation_id = $product->get_id();
        // Смена статуса на 'draft' для отключения вариации
        wp_update_post([
            'ID' => $variation_id,
            'post_status' => 'draft'
        ]);
    }
}

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

$args = [
    'post_type' => 'product_variation',
    'post_status' => 'publish',
    'posts_per_page' => -1
];
$variations = get_posts($args);
foreach ($variations as $variation_post) {
    $variation = wc_get_product($variation_post->ID);
    if ($variation->get_stock_quantity() === 0) {
        wp_update_post([
            'ID' => $variation_post->ID,
            'post_status' => 'draft'
        ]);
    }
}

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

  • Создайте тестовую вариацию с запасом 1 и измените запас на 0 — вариация должна автоматически перейти в статус «черновик».
  • Проверьте админку: в списке вариаций не должно быть опубликованных с нулевым запасом.
  • Запустите массовый скрипт и убедитесь, что все вариации с нулевым запасом стали «draft».

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

  • Вариации не меняют статус после обновления запаса. Проверьте, что хук woocommerce_product_set_stock подключен и не конфликтует с другими плагинами.
  • Неправильный статус для отключения. Используйте статус draft или private — не trash, чтобы избежать случайного удаления.
  • Скрипт массового отключения не срабатывает. Убедитесь, что вызываете функцию в правильном контексте и используете wp_update_post с корректными параметрами.

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

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

Сравнение способов реализации автоматического отключения вариаций

МетодПлюсыМинусы
Хук woocommerce_product_set_stockАвтоматическое срабатывание при обновленииНе обрабатывает старые вариации без обновлений
Массовый скрипт с WP_QueryОбрабатывает все вариации сразуНагрузка на сервер при большом количестве товаров
Плагины для очистки каталогаУдобный интерфейс, дополнительные функцииМогут замедлить сайт, требуют лицензий
Как создать автоматические ответы на комментарии в WordPress
30.12.2025
WooCommerce: автоматическое изменение статуса возврата после просрочки
08.06.2026
Как удалить неиспользуемые attachment в WordPress: практическое руководство
28.02.2026
Автоматическое изменение веса продукта в WooCommerce при обновлении атрибутов
21.05.2026
WooCommerce: автоматическое отключение неактивных вариаций товаров
05.05.2026