wpcat.ru wordpress WPCat.ru

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

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

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

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

Первым шагом нужно убедиться, что для каждого варианта товара корректно ведется учёт запасов (manage_stock = true) и что у варианта правильно настроено количество (stock_quantity). Если WooCommerce не отслеживает запасы варианта, решение не сработает.

  • Проверьте, что в настройках варианта включено управление запасами.
  • Убедитесь, что у варианта есть актуальное количество на складе.
  • Проверьте, что WooCommerce настроен на скрытие товаров без запасов (Настройки > Товары > Запасы > «Скрывать отсутствующие товары»).

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

Ниже приведён пример кода, который автоматически меняет статус варианта на private, если запас равен 0 или меньше. Код можно добавить в functions.php вашей темы или в кастомный плагин.

add_action('woocommerce_product_set_stock', 'auto_disable_variation_if_out_of_stock', 10, 1);
function auto_disable_variation_if_out_of_stock($product) {
    if (!$product->is_type('variation')) {
        return; // Обрабатываем только варианты
    }

    $stock_quantity = $product->get_stock_quantity();
    $post_id = $product->get_id();

    if ($stock_quantity <= 0) {
        // Отключаем вариант
        wp_update_post([
            'ID' => $post_id,
            'post_status' => 'private'
        ]);
    } else {
        // Включаем вариант обратно, если есть запас
        wp_update_post([
            'ID' => $post_id,
            'post_status' => 'publish'
        ]);
    }
}

Этот код срабатывает при изменении запасов варианта товара и обновляет его статус публикации. Статус private эффективно отключает вариант от отображения на сайте.

Автоматическое обновление для всех вариантов

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

function disable_out_of_stock_variations_bulk() {
    $args = [
        'post_type' => 'product_variation',
        'posts_per_page' => -1,
        'post_status' => ['publish', 'private']
    ];

    $variations = get_posts($args);

    foreach ($variations as $variation_post) {
        $variation = wc_get_product($variation_post->ID);
        if (!$variation) continue;

        $stock_quantity = $variation->get_stock_quantity();

        $new_status = ($stock_quantity <= 0) ? 'private' : 'publish';
        if ($variation_post->post_status !== $new_status) {
            wp_update_post([
                'ID' => $variation_post->ID,
                'post_status' => $new_status
            ]);
        }
    }
}
// Запускать вручную или через WP-CLI
// disable_out_of_stock_variations_bulk();

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

  • Измените количество на складе варианта через админку WooCommerce.
  • Обновите страницу товара на фронтенде — варианты с нулевым запасом должны исчезать.
  • Проверьте, что при увеличении запаса вариант возвращается в список.
  • В админке проверьте статус варианта (должен меняться между publish и private).

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

  • Вариант не меняет статус: проверьте, что woocommerce_product_set_stock срабатывает. Возможно, нужно использовать woocommerce_variation_set_stock или обновлять вручную.
  • Вариант остаётся видимым, хотя статус private: убедитесь, что тема и плагины корректно учитывают статус публикации варианта.
  • Запасы не отслеживаются: в настройках варианта должен быть включён «Управление запасами», иначе количество не будет учитываться.
  • Производительность страдает при массовом обновлении: запускайте массовые операции по cron или WP-CLI, чтобы избежать таймаутов.

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

  • Для автоматизации используйте WP-CLI: запуск скрипта массового обновления можно делать через командную строку без нагрузки на сайт.
  • Не меняйте статус варианта слишком часто — лучше делать это по крону, например, раз в час.
  • Для улучшения UX можно добавить пользовательское сообщение или иконку «нет в наличии» вместо полного скрытия варианта.
  • Используйте транзиенты или кеширование для снижения нагрузки при частых проверках.

Сравнение подходов: плагин vs. код vs. ручное управление

ПодходПлюсыМинусыКомпромисс
Готовый плагин (например, WooCommerce Stock Manager)Быстрое решение, интерфейс для редактирования запасовМожет быть тяжеловесным, лишний функционалИспользовать для магазинов без кастомных требований
Кодовое решение (как в статье)Гибкость, лёгкость, минимум нагрузкиТребует поддержки и тестирования, возможно, багиОптимально для разработчиков и кастомных проектов
Ручное управление (админка WooCommerce)Простота, без кодаТрудозатратно при больших каталогах, ошибки человеческого фактораПодходит для небольших магазинов
×
Обнови свой WordPress!

Держи скидку 15% на премиум тему Reboot

Купить со скидкой ⋙