Проблема: товары остаются активными при отсутствии остатков на складе
В стандартной настройке WooCommerce товары с нулевым остатком могут оставаться опубликованными и доступными для просмотра, что вводит покупателей в заблуждение и снижает конверсию. Особенно остро эта проблема стоит для магазинов с частыми изменениями наличия. Автоматическое отключение товаров при отсутствии товара на складе помогает избежать подобных ошибок.
Диагностика проблемы
- Проверьте настройки управления запасами:
WooCommerce > Настройки > Запасы. Включена ли опция "Включить управление запасами"? - Убедитесь, что для товаров включено управление запасами и установлены корректные остатки.
- Проверьте, какие статусы у товаров с нулевым запасом: опубликованы ли они?
Если товары с 0 в запасе остаются опубликованными, значит автоматического перехода в статус "Черновик" или "Скрытый" не происходит.
Пошаговое решение: автоматическое отключение товаров без остатков
1. Включите управление запасами в WooCommerce
Перейдите в WooCommerce > Настройки > Запасы и убедитесь, что включена опция "Включить управление запасами". Без этого WooCommerce не будет отслеживать остатки.
2. Добавьте пользовательский код для автоматического смены статуса товаров
Добавьте следующий код в файл functions.php вашей активной темы или в плагин для пользовательских функций:
add_action('woocommerce_product_set_stock', 'auto_unpublish_out_of_stock_products', 10, 1);
function auto_unpublish_out_of_stock_products($product) {
if (!$product instanceof WC_Product) return;
$stock_quantity = $product->get_stock_quantity();
$post_status = get_post_status($product->get_id());
if ($stock_quantity !== null && $stock_quantity <= 0 && $post_status === 'publish') {
// Снимаем с публикации товар без остатков
wp_update_post(array(
'ID' => $product->get_id(),
'post_status' => 'draft'
));
} elseif ($stock_quantity > 0 && $post_status === 'draft') {
// Восстанавливаем публикацию, если товар появился в наличии
wp_update_post(array(
'ID' => $product->get_id(),
'post_status' => 'publish'
));
}
}Этот код автоматически переводит товар в статус "Черновик", если остаток ≤ 0, и обратно в "Опубликовано", если запас появился.
3. Принудительная проверка статусов для всех товаров
Если у вас много товаров, после добавления кода выполните однократный запуск проверки остатков и статусов через WP-CLI или кастомный скрипт.
function batch_unpublish_out_of_stock_products() {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => array('publish', 'draft')
);
$products = get_posts($args);
foreach ($products as $post) {
$product = wc_get_product($post->ID);
if (!$product) continue;
$stock = $product->get_stock_quantity();
$status = $post->post_status;
if ($stock !== null && $stock <= 0 && $status === 'publish') {
wp_update_post(array('ID' => $post->ID, 'post_status' => 'draft'));
} elseif ($stock > 0 && $status === 'draft') {
wp_update_post(array('ID' => $post->ID, 'post_status' => 'publish'));
}
}
}
// batch_unpublish_out_of_stock_products(); // Запустите вручную один разПроверка результата после внедрения
- Обновите остаток товара в админке WooCommerce > Товары. Установите 0 и сохраните.
- Убедитесь, что товар автоматически стал черновиком (статус изменился).
- Поставьте положительный запас и проверьте, что товар вновь стал опубликованным.
- Проверьте на фронтенде, что товары с 0 запасом не отображаются в каталоге.
Частые ошибки и их исправление
- Код не срабатывает при изменении остатков — возможно, другой плагин перезаписывает статус товара после вашего кода. Проверьте приоритет хука или используйте
woocommerce_product_set_stock_status. - Не включено управление запасами — без этой опции WooCommerce не отслеживает остатки.
- Товары с вариациями — для вариативных товаров может потребоваться отдельная логика проверки остатков всех вариаций.
- Кэширование — если кэш страниц не очищается, изменения статусов могут отображаться с задержкой.
Практические советы по безопасности и производительности
- Не добавляйте тяжелые операции в хуки с низким приоритетом, чтобы избежать замедления админки.
- Для массовых обновлений используйте WP-CLI или отложенные задачи (cron), чтобы избежать таймаутов.
- Всегда делайте бэкап базы перед массовыми изменениями статусов товаров.
- Если на сайте много вариационных товаров, расширьте код проверкой остатков по всем вариациям, чтобы избежать ошибок.
Сравнение способов реализации автоматического отключения товаров
| Метод | Преимущества | Недостатки |
|---|---|---|
Код на хуке woocommerce_product_set_stock | Автоматическая реакция на изменение остатков, нет сторонних плагинов | Не учитывает вариации без доработки, требует навыков PHP |
| Плагины управления запасами | Готовое решение с интерфейсом, часто поддерживают вариации | Могут замедлять сайт, могут быть платными |
| Ручное управление статусом | Полный контроль, просто | Высокий риск ошибок и забывания, не подходит для больших магазинов |