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

Проблема: как управлять неактивными вариантами товаров в WooCommerce

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

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

Под неактивными вариантами здесь мы понимаем те варианты, у которых:

  • отсутствует запас на складе (stock_quantity = 0), или
  • статус управления запасами установлен, но товар отмечен как outofstock, или
  • вариант отключен вручную (post_status = 'private' или 'draft').

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

SELECT p.ID AS variation_id, p.post_title, pm.meta_value AS stock_status, pm2.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_status'
LEFT JOIN wp_postmeta pm2 ON p.ID = pm2.post_id AND pm2.meta_key = '_stock'
WHERE p.post_type = 'product_variation'
AND (pm.meta_value = 'outofstock' OR pm2.meta_value = '0' OR pm2.meta_value IS NULL);

Этот запрос покажет варианты товаров с нулевым запасом или статусом "нет в наличии".

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

1. Создаем функцию для массового отключения

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

function wc_disable_outofstock_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'outofstock',
                'compare' => '=',
            ],
        ],
        'fields' => 'ids',
    ];

    $variations = get_posts($args);

    foreach ($variations as $variation_id) {
        // Меняем статус варианта на 'private' для отключения
        $updated = wp_update_post([
            'ID'          => $variation_id,
            'post_status' => 'private',
        ]);

        if (is_wp_error($updated)) {
            error_log('Ошибка при отключении варианта ID ' . $variation_id);
        }
    }
}

// Для вызова вручную:
// wc_disable_outofstock_variations();

2. Добавляем планировщик задач для автоматизации

Чтобы запускать функцию регулярно, используйте WP-Cron. Например, добавим еженедельный запуск:

function wc_schedule_disable_variations() {
    if (!wp_next_scheduled('wc_disable_outofstock_variations_hook')) {
        wp_schedule_event(time(), 'weekly', 'wc_disable_outofstock_variations_hook');
    }
}
add_action('wp', 'wc_schedule_disable_variations');

add_action('wc_disable_outofstock_variations_hook', 'wc_disable_outofstock_variations');

3. Как запустить сразу вручную

Для немедленного выполнения вызовите функцию в консоли WP-CLI или временно добавьте вызов в functions.php (после теста — удалите):

wc_disable_outofstock_variations();

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

  • Перейдите в админку WooCommerce > Товары > Вариации и убедитесь, что варианты с нулевым запасом имеют статус "Личный" (private) или неактивны.
  • Выполните SQL-запрос из раздела диагностики — неактивные варианты должны отсутствовать в выборке.
  • Проверьте страницу товара на фронтенде — отключенные варианты не должны отображаться в выборе.

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

  • Функция не отключает варианты: проверьте, что мета ключи _stock_status и _stock установлены корректно. Иногда плагин управления складом использует свои ключи.
  • Варианты остаются видимыми: возможно, тема или кэш не обновляются. Очистите кэш сайта и браузера.
  • WP-Cron не срабатывает: настройте системный cron на сервере или используйте плагин для управления задачами WP-Cron.
  • Ошибки при обновлении постов: проверьте права пользователя, от имени которого выполняется код, и разрешения на запись в базу.

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

  • Перед массовым изменением статусов создайте резервную копию базы данных.
  • Не запускайте функцию массового отключения на пиковом трафике — нагрузка может быть высокой.
  • Вместо статуса private можно использовать мета-поле для отметки «отключено», чтобы не влиять на видимость в админке.
  • Используйте транзиенты для кеширования результата длительных выборок при необходимости.
  • Если используется WPShop Clearfy, проверьте настройки очистки метаданных, чтобы не удалить нужные ключи.

Сравнение способов отключения вариантов

МетодОписаниеПлюсыМинусы
Ручное отключениеИзменение статуса варианта через админкуПросто, без кодаДолго при большом количестве товаров, риск пропуска
Автоматизация через кодСкрипт с WP-Cron для массового отключенияАвтоматически, быстро, масштабируемоТребует навыков программирования, возможные ошибки при неправильном коде
Плагины управления складомИспользуют встроенные функции для статусовИнтегрировано с учётом запасовДополнительная нагрузка, стоимость, возможные конфликты
Использование хука WooCommerce 'woocommerce_order_status_changed' для автоматизации
26.04.2026
Как добавить поддержку новых типов файлов в WordPress без плагинов
28.12.2025
Как создать автоматический импорт данных из XML в WordPress с примерами кода
30.01.2026
Как создать автоматический импорт продуктов из CSV в WooCommerce
26.02.2026
Как создать собственный шорткод в WordPress
01.11.2025

Плагин службы технической поддержки для WordPress. Создание, просмотр и ответ на тикеты. Уведомление пользователей и другие функции.