WPExperts

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

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

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

Почему автоматизация важна

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

Диагностика: как проверить состояние остатков и статуса товаров

Для диагностики ситуации с остатками и статусами товаров полезно использовать следующие инструменты и методы:

  • WooCommerce Stock Report: в админке WooCommerce в разделе Отчеты есть вкладка по запасам, где можно видеть товары с низким или нулевым остатком.
  • Запросы к базе данных: с помощью phpMyAdmin или WP-CLI можно выполнить SQL-запрос для выявления товаров и вариаций с остатком 0.
  • Проверка статуса товара: в админке убедитесь, что товар и вариации действительно активны (статус “В наличии” или “В продаже”).

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

Реализуем функционал, который запускается по расписанию (через WP-Cron) и проверяет запасы всех товаров и вариаций, отключая те, у которых остаток равен нулю.

1. Добавление WP-Cron задачи

add_action('wp', function() {
    if (!wp_next_scheduled('auto_disable_out_of_stock_products')) {
        wp_schedule_event(time(), 'hourly', 'auto_disable_out_of_stock_products');
    }
});

2. Основная функция проверки и отключения

add_action('auto_disable_out_of_stock_products', function() {
    // Получаем все опубликованные товары и вариации
    $args = [
        'post_type' => ['product', 'product_variation'],
        'post_status' => 'publish',
        'numberposts' => -1,
        'meta_query' => [
            [
                'key' => '_stock_status',
                'value' => 'outofstock',
            ],
        ],
    ];
    $products = get_posts($args);

    foreach ($products as $product_post) {
        // Меняем статус на черновик, чтобы скрыть товар
        wp_update_post([
            'ID' => $product_post->ID,
            'post_status' => 'draft',
        ]);
    }
});

В этом коде мы ищем все товары и вариации со статусом запаса outofstock и меняем их статус публикации на draft, скрывая их с сайта.

3. Дополнительная проверка для вариаций

Для вариаций логично отключать их отдельно, но если все вариации товара отключены, то можно отключить и сам товар:

add_action('auto_disable_out_of_stock_products', function() {
    $products = wc_get_products(['status' => 'publish', 'limit' => -1]);

    foreach ($products as $product) {
        if ($product->is_type('variable')) {
            $variations = $product->get_children();
            $all_out_of_stock = true;
            foreach ($variations as $variation_id) {
                $variation = wc_get_product($variation_id);
                if ($variation->is_in_stock()) {
                    $all_out_of_stock = false;
                    break;
                }
            }
            if ($all_out_of_stock) {
                wp_update_post([
                    'ID' => $product->get_id(),
                    'post_status' => 'draft',
                ]);
            }
        }
    }
});

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

После активации кода:

  • Зайдите в админку WooCommerce и откройте список товаров. Товары и вариации с нулевым остатком должны иметь статус Черновик.
  • Проверьте страницу каталога на фронтенде — товары с нулевым остатком не должны отображаться.
  • Для теста можно вручную изменить остаток одного из товаров на 0 и запустить WP-Cron вручную через плагин или WP-CLI (wp cron event run auto_disable_out_of_stock_products).

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

  • Не запускается WP-Cron: Убедитесь, что на вашем сервере правильно работает WP-Cron, либо настройте системный cron для вызова wp-cron.php.
  • Товары не меняют статус: Проверьте права пользователя, под которым выполняется код, и убедитесь, что нет конфликтов с другими плагинами, блокирующими изменение статусов.
  • Вариации остаются видимыми: Проверьте, что мета _stock_status корректно обновляется WooCommerce при изменении запасов. Если нет, нужно отследить, почему запасы не синхронизируются.

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

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

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

МетодПлюсыМинусы
Код через WP-Cron (описанный выше)Полный контроль, без сторонних плагинов, гибкостьТребует знаний PHP, возможны проблемы с WP-Cron
Плагины управления запасами (например, WooCommerce Stock Manager)Простота установки, визуальный интерфейсМожет быть избыточным, нагрузка на сайт
Ручное управлениеПростота в малом бизнесеВысокий риск ошибок, трудоемко
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »