Диагностика проблемы с нулевыми остатками в WooCommerce
Частая проблема в интернет-магазинах на WooCommerce — некорректное отображение товаров с нулевым остатком. Такие товары продолжают отображаться, их можно заказать, что приводит к ошибкам в заказах и ухудшению пользовательского опыта. Также часто возникает задача автоматически изменять цену товара при достижении определённых условий, например, при снижении остатка.
Для диагностики используйте следующие шаги:
- Проверьте в админке WooCommerce наличие товаров с остатком 0.
- Проверьте настройки WooCommerce:
WooCommerce > Настройки > Продукты > Запасы— включена ли опция Управлять запасами и Скрывать товары при отсутствии на складе. - Посмотрите, не переопределяет ли тема или плагины отображение товаров с нулевым остатком.
- Используйте плагин Query Monitor для проверки SQL-запросов, чтобы убедиться, что товары с нулевым остатком действительно исключаются из запросов.
Пошаговое решение: отключение товаров при нулевом остатке без плагинов
Шаг 1. Включение управления запасами
В админке WooCommerce перейдите в WooCommerce > Настройки > Продукты > Запасы и убедитесь, что включена опция Управлять запасами.
Шаг 2. Скрытие товаров с нулевым остатком
В той же вкладке активируйте опцию Скрывать товары при отсутствии на складе. Это базовое решение.
Шаг 3. Автоматическое изменение цены для товаров с низким остатком
Добавьте следующий код в файл functions.php активной темы или в плагин для кастомных функций:
add_action('woocommerce_before_calculate_totals', 'wpexperts_adjust_price_low_stock', 10, 1);
function wpexperts_adjust_price_low_stock( $cart ) {
if ( is_admin() && ! defined('DOING_AJAX') ) return;
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
$stock_quantity = $product->get_stock_quantity();
if ( $stock_quantity !== null && $stock_quantity <= 5 && $stock_quantity > 0 ) {
// Снижаем цену на 10% при остатке 5 и меньше
$regular_price = $product->get_regular_price();
$new_price = $regular_price * 0.9;
$product->set_price( $new_price );
}
}
}Этот код автоматически снижает цену в корзине для товаров, у которых остаток 5 и меньше. Можно подстроить условие под свои нужды.
Шаг 4. Автоматическое отключение товаров с нулевым остатком (в админке и на фронтенде)
Чтобы полностью отключать товары с нулевым остатком, добавьте следующий код:
add_action( 'woocommerce_product_set_stock_status', 'wpexperts_disable_product_on_zero_stock', 10, 3 );
function wpexperts_disable_product_on_zero_stock( $product_id, $stock_status, $product ) {
if ( $stock_status === 'outofstock' ) {
// Меняем статус продукта на 'черновик', чтобы скрыть его
wp_update_post( array(
'ID' => $product_id,
'post_status' => 'draft',
) );
} elseif ( $stock_status === 'instock' ) {
// Восстанавливаем статус 'опубликовано' при появлении товара
$post = get_post( $product_id );
if ( $post->post_status === 'draft' ) {
wp_update_post( array(
'ID' => $product_id,
'post_status' => 'publish',
) );
}
}
}Этот код при обновлении статуса запаса автоматически переводит товар в черновик, если остаток 0, и возвращает в опубликованные при появлении товара.
Проверка результата после внедрения
Для проверки выполните:
- Создайте тестовый товар с остатком 0 и убедитесь, что он скрыт на сайте и в каталоге.
- Создайте товар с остатком 5 или меньше и добавьте его в корзину, проверьте, что цена снижается на 10%.
- Измените остаток товара через админку, проверьте, что статус товара меняется корректно.
Частые ошибки и способы их исправления
- Опция «Скрывать товары при отсутствии на складе» не работает: проверьте, не переопределяет ли тема шаблон вывода каталога. Для теста переключитесь на стандартную тему Storefront.
- Автоматическое изменение цены не срабатывает в корзине: убедитесь, что хук
woocommerce_before_calculate_totalsдобавлен без ошибок и что условия внутри функции корректны. - Товары с нулевым остатком не переводятся в черновик: проверьте, что хук
woocommerce_product_set_stock_statusсрабатывает, и нет конфликтов с другими плагинами, которые меняют статус товара. - Изменения цен не отображаются в мини-корзине: вызовите
WC()->cart->calculate_totals();после установки цены, если нужно обновить корзину принудительно.
Практические советы по безопасности и производительности
- Код добавляйте в дочернюю тему или отдельный плагин, чтобы не потерять при обновлении.
- Избегайте тяжелых запросов к базе в хуках, используйте кэширование, если нужно.
- Для массовых изменений статусов товаров лучше создавать WP-CLI команды или использовать Cron, чтобы не блокировать страницу при обновлении.
- При автоматическом изменении цены учитывайте совместимость с другими плагинами скидок и кэшированием страниц.
Сравнение способов решения
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Опция WooCommerce «Скрывать товары при отсутствии» | Простота, не требует кода | Может не работать с кастомными темами | Малые магазины без кастомного вывода |
| Код для изменения статуса товара (draft) | Полное скрытие товара, автоматизация | Может влиять на SEO, требует тестирования | Средние и крупные магазины с контролем статусов |
| Автоматическое изменение цены через хук корзины | Гибкость, легко настроить условия | Не влияет на цену в каталоге, только в корзине | Магазины с динамическими скидками |