wpdebug.ru wordpress WP Debug

WooCommerce: автоматическое разрешение и отключение вариантов товаров по условиям

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

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

Типичные сценарии:

  • Отключение вариантов, которые отсутствуют на складе, без удаления их из каталога.
  • Автоматическое разрешение вариантов в зависимости от выбора других опций (например, цвет + размер).
  • Временное отключение вариантов товаров в определённые периоды (распродажи, акции).

Пошаговое решение: как программно управлять статусом вариантов товаров

1. Получение вариаций товара и их текущего статуса

Для начала нужно получить все варианты конкретного товара и проверить их статус (доступен или отключён).

function get_product_variations_status($product_id) {
    $product = wc_get_product($product_id);
    if (! $product || $product->get_type() !== 'variable') {
        return [];
    }
    $variations = $product->get_children();
    $statuses = [];
    foreach ($variations as $variation_id) {
        $variation = wc_get_product($variation_id);
        $statuses[$variation_id] = $variation->is_in_stock() && $variation->is_purchasable();
    }
    return $statuses;
}

2. Отключение варианта товара (деактивация вариации)

Для отключения варианта меняем его статус публикации на "черновик". Это отключит вариант от показа на фронтенде без удаления.

function disable_variation($variation_id) {
    $variation_post = [
        'ID' => $variation_id,
        'post_status' => 'draft'
    ];
    wp_update_post($variation_post);
}

3. Автоматическое включение варианта (активировать вариацию)

Аналогично отключению, но меняем статус на "publish".

function enable_variation($variation_id) {
    $variation_post = [
        'ID' => $variation_id,
        'post_status' => 'publish'
    ];
    wp_update_post($variation_post);
}

4. Пример: автоматическое отключение вариантов без запаса на складе при обновлении товара

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

add_action('woocommerce_update_product', 'auto_disable_out_of_stock_variations');
function auto_disable_out_of_stock_variations($product_id) {
    $product = wc_get_product($product_id);
    if (!$product || $product->get_type() !== 'variable') {
        return;
    }
    $variations = $product->get_children();
    foreach ($variations as $variation_id) {
        $variation = wc_get_product($variation_id);
        if (!$variation->is_in_stock()) {
            disable_variation($variation_id);
        } else {
            enable_variation($variation_id);
        }
    }
}

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

Чтобы проверить работоспособность решения:

  • В админке WooCommerce откройте вариации товара и измените количество на складе для варианта на 0.
  • Сохраните товар.
  • На фронтенде зайдите на страницу товара и проверьте, что вариант с нулевым запасом не отображается в списке выбора вариаций.
  • Для варианта с положительным запасом проверьте, что он доступен для выбора и добавления в корзину.

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

  • Вариации не отключаются после установки статуса "draft": Проверьте, что вы не используете плагин, который влияет на статус публикации вариаций. Иногда кэширование или сторонние плагины могут мешать отображению.
  • Автоматическое включение вариаций не срабатывает: Убедитесь, что в функции включения варианта вы правильно обновляете статус и что хук срабатывает после сохранения товара.
  • Изменения не видны на фронте: Очистите кэш сайта и браузера, проверьте, что тема и плагины не кешируют варианты отдельно.

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

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

Сравнение подходов к управлению вариантами

МетодОписаниеПлюсыМинусы
Изменение статуса публикации (draft/publish)Отключение варианта через изменение статуса поста вариацииПростая реализация, вариация не удаляетсяМожет конфликтовать с плагинами кэширования, требует очистки кэша
Отключение через атрибут "наличие"Управление доступностью варианта через stock statusСтандартный WooCommerce функционалВариант отображается, но недоступен для покупки (может сбивать пользователя)
Фильтрация вариантов в шаблонахУдаление вариантов на уровне фронтенда с помощью хуков фильтровПолный контроль над отображениемСложнее в реализации, вариации остаются в базе
×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙