Проблема: зачем отключать неактивные варианты товаров в WooCommerce
В интернет-магазине на WooCommerce часто возникает ситуация, когда у товаров есть множество вариаций, часть из которых временно или постоянно отсутствует на складе. Если неактивные варианты остаются видимыми, это может запутать покупателя и ухудшить UX, а также привести к ошибкам при оформлении заказа.
Автоматическое отключение или скрытие вариаций с нулевым остатком и статусом «нет в наличии» помогает повысить удобство использования магазина и уменьшить количество обращений в техподдержку.
Диагностика проблемы: как понять, что варианты товаров неактивны
Для начала необходимо проверить, как WooCommerce обрабатывает запасы и отображение вариаций:
- В настройках WooCommerce —
WooCommerce > Настройки > Товары > Запасы— должна быть включена опция «Включить управление запасами». - Для каждого варианта товара в админке проверьте поля «Управление запасами», «Количество на складе» и «Статус наличия» (например, «Нет в наличии»).
- На фронтенде убедитесь, что вариации с нулевым остатком показываются (если это нежелательно).
Если неактивные варианты отображаются покупателям, нужно автоматизировать их отключение.
Пошаговое решение: автоматическое отключение вариаций с нулевым остатком
1. Создаем функцию для автоматического изменения статуса вариаций
Добавьте следующий код в файл 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')) {
$stock_quantity = $product->get_stock_quantity();
$manage_stock = $product->get_manage_stock();
if ($manage_stock && $stock_quantity <= 0) {
$product->set_status('private'); // Отключаем вариацию
$product->save();
} else {
if ($product->get_status() === 'private') {
$product->set_status('publish'); // Включаем вариацию, если есть на складе
$product->save();
}
}
}
}Эта функция срабатывает при изменении запаса конкретного варианта. Если запас 0 или меньше — устанавливаем статус «private», чтобы вариация стала недоступна покупателям.
2. Запускаем массовое обновление для существующих вариаций
Чтобы сразу отключить все неактивные вариации, можно выполнить скрипт разового запуска через WP-CLI или временно добавить код:
function disable_all_out_of_stock_variations() {
$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);
$stock_quantity = $variation->get_stock_quantity();
$manage_stock = $variation->get_manage_stock();
if ($manage_stock && $stock_quantity <= 0 && $variation->get_status() !== 'private') {
$variation->set_status('private');
$variation->save();
} elseif ($manage_stock && $stock_quantity > 0 && $variation->get_status() === 'private') {
$variation->set_status('publish');
$variation->save();
}
}
}
// Запустить один раз
// disable_all_out_of_stock_variations();После выполнения раскомментируйте вызов функции, чтобы не запускать её при каждом запросе.
Проверка результата после внедрения
- Обновите запасы вариаций в админке и проверьте, что вариации с 0 остатком скрываются из каталога и страниц товара.
- Попробуйте добавить неактивную вариацию в корзину — её не должно быть в списке выбора.
- Проверьте на клиентском сайте, что переключение вариаций не предлагает варианты с нулевым остатком.
Частые ошибки и как их исправить
- Вариации по-прежнему отображаются: проверьте, что в настройках WooCommerce включено управление запасами и отключена опция «Разрешить заказы при отсутствии товара» (
WooCommerce > Настройки > Товары > Запасы). - Статус вариации не меняется: убедитесь, что функция подключена и нет конфликтов с другими плагинами, влияющими на статусы продуктов.
- Проблемы с кешированием: после изменения запасов очистите кеш сайта и браузера, чтобы увидеть актуальное состояние.
- Вариации становятся невидимыми в админке: статус
privateскрывает вариации в публичной части, но они остаются видимыми в админке, если возникнут проблемы с видимостью, проверьте права пользователя.
Практические советы по безопасности и производительности
- Используйте WP-CLI для массовых операций с вариациями, это быстрее и безопаснее, чем запускать тяжелые циклы с PHP через веб.
- Автоматизируйте обработку через хук
woocommerce_product_set_stock, чтобы не запускать лишние запросы при каждом загрузке страницы. - Периодически выполняйте аудит вариаций с помощью SQL-запросов для выявления несоответствий в запасах и статусах.
- Если магазин большой, подумайте о создании отдельного cron-задачи для регулярной проверки и обновления статусов вариаций.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
Использование хука woocommerce_product_set_stock | Автоматическое обновление, минимальная нагрузка | Не охватывает массовые изменения сразу | Комбинировать с разовым скриптом для массовой обработки |
Массовый скрипт на get_posts | Обрабатывает все вариации сразу | Высокая нагрузка при большом каталоге, требует запуска вручную | Запускать через WP-CLI или ограничивать пакетами |
| Плагины управления запасами | Готовые решения с UI, дополнительные функции | Может замедлять сайт, возможны конфликты | Использовать при больших магазинах и сложных сценариях |