Проблема: вариации товаров WooCommerce остаются активными при отсутствии на складе
В интернет-магазинах на WooCommerce часто возникает ситуация, когда вариации товаров остаются доступными для выбора даже при отсутствии их на складе. Это приводит к ошибкам оформления заказа, негативному опыту пользователей и дополнительной нагрузке на службу поддержки.
Стандартные настройки WooCommerce позволяют только скрывать отсутствующие товары в каталоге глобально, но не управляют видимостью конкретных вариаций внутри товара. В результате, клиенты могут увидеть варианты, которые нельзя заказать.
Как диагностировать проблему
- Проверьте настройки отображения отсутствующих товаров в WooCommerce (
WooCommerce > Настройки > Товары > Запасы). - Откройте страницу товара с вариациями и посмотрите, активны ли вариации с нулевым запасом.
- Попробуйте добавить такую вариацию в корзину — если это возможно, значит проблема действительно есть.
Пошаговое решение: автоматическое отключение вариаций без запаса
Для реализации автоматического отключения вариаций, у которых на складе ноль или меньше, достаточно добавить кастомный код в файл functions.php вашей темы или создать небольшой плагин.
Основная логика — программно менять статус вариаций на 'private' или 'draft', либо скрывать их из списка вариаций на фронтенде.
Пример кода для скрытия вариаций без наличия
add_filter('woocommerce_variation_is_active', 'disable_variation_if_out_of_stock', 10, 2); function disable_variation_if_out_of_stock($is_active, $variation) { $stock_quantity = $variation->get_stock_quantity(); $manage_stock = $variation->managing_stock(); $is_in_stock = $variation->is_in_stock(); if ($manage_stock && (!$is_in_stock || $stock_quantity <= 0)) { return false; // скрыть вариацию } return $is_active; }Этот фильтр проверяет наличие каждой вариации при загрузке страницы и скрывает те, что нет в наличии.
Автоматическое обновление статуса вариаций в админке
Чтобы обновлять статусы вариаций автоматически без ручной проверки, можно использовать WP-CLI или CRON-задачу, которая будет менять статус вариаций:
function update_variation_status_by_stock() { $args = [ 'post_type' => 'product_variation', 'posts_per_page' => -1, 'post_status' => ['publish', 'private', 'draft'], ]; $variations = get_posts($args); foreach ($variations as $variation_post) { $variation = wc_get_product($variation_post->ID); if (!$variation) continue; $stock = $variation->get_stock_quantity(); $manage_stock = $variation->managing_stock(); $status = $variation_post->post_status; if ($manage_stock && ($stock === null || $stock <= 0)) { if ($status === 'publish') { wp_update_post(['ID' => $variation_post->ID, 'post_status' => 'private']); } } elseif ($status !== 'publish') { wp_update_post(['ID' => $variation_post->ID, 'post_status' => 'publish']); } } } add_action('wp_scheduled_stock_update', 'update_variation_status_by_stock');Дальше создайте CRON-задачу в WordPress для регулярного вызова wp_scheduled_stock_update.
Проверка результата после внедрения
- Очистите кэш сайта и браузера.
- Откройте страницу товара с вариациями, у которых запас равен нулю — они должны быть скрыты.
- Попробуйте оформить заказ с такими вариациями — кнопка «В корзину» должна быть недоступна.
- Проверьте статус вариаций в админке — отсутствующие должны иметь статус
privateилиdraft.
Частые ошибки и их исправление
- Вариации не скрываются на фронтенде. Проверьте, активен ли фильтр
woocommerce_variation_is_activeи нет ли конфликтов с плагинами кэширования. - Автоматическое обновление статусов не работает. Убедитесь, что CRON-задача зарегистрирована и выполняется. Для отладки можно вызвать функцию вручную.
- Пользователи видят вариации, но кнопка «В корзину» отключена. Это может запутать клиентов. Лучше полностью скрыть такие вариации.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
- Оптимизируйте функцию обновления статусов вариаций, добавив обработку только изменённых товаров, если есть возможность.
- Регулярно проверяйте логи ошибок и корректность работы CRON-задач.
- Не используйте изменение статуса вариаций для скрытия товара, если используете сторонние плагины, которые могут некорректно реагировать на смену статуса.
Сравнение способов скрытия вариаций без запаса
| Метод | Преимущества | Недостатки |
|---|---|---|
Фильтр woocommerce_variation_is_active | Просто в реализации, не меняет статусы в базе | Вариации всё ещё видны в админке, возможны конфликты с плагинами |
| Изменение статуса вариаций (publish/private) | Чистое скрытие в админке и на сайте | Требует регулярного обновления, возможно влияние на другие процессы |
| Использование плагинов (например, WooCommerce Out of Stock Visibility) | Готовое решение, поддержка | Потенциально нагружает сайт, дополнительный софт |