Наличие товара в Woocommerce — настройки, хаки, надпись «Нет в наличии», функция is_in_stock и др.
Поговорим о разных ситуациях, которые возникают с показателем наличия товара в Woocommerce. Недавно пришлось решить несколько задач по теме, и захотелось собрать все сниппеты в одном посте. Сегодня расскажу про: функцию is_in_stock для проверки статуса продукции на складе, отображение соответствующих бейджей и модификацию цены.
Кое-какие смежные нюансы я уже затрагивал в блоге, плюс, думаю, вопросы в публикации далеко не последние по данной теме, поэтому статья будет дополнятся новыми хаками.
Список задач:
- Вывод бейджа «Нет в наличии».
- Меняем надпись/перевод.
- Функция is_in_stock.
- Надпись нет товара возле цены.
- Скрытие/вывод категорий без продукции.
- Плагин WHWS Display In Stock Products First For WooCommerce (ссылка на другой пост блога) — максимально простой вариант вывода товаров в наличии в самом начале каталога магазина
- Скрытие товаров не в наличии в Woocommerce шорткодах и похожих товарах.
Начнем с базовых понятий. В настройках каждого продукта есть вкладка «Запасы», где можете управлять данной характеристикой: укажите, что та или иная позиция сейчас недоступна либо наоборот измените статус остатка нет в наличии на противоположный (когда она появится).
Как правило, в современных Woocommerce шаблонах разработчики заранее предусматривают подобные ситуации, и при смене настроек вы увидите соответствующую реакцию/сообщение на сайте. Но иногда нужно сделать некоторые дополнительные штуки во фронтенде…
Бейдж нет в наличии в Woocommerce
Чтобы добавить соответствующую надпись на страницу каталога (категории) магазина, размещаете в файле функций functions.php код:
add_action( 'woocommerce_before_shop_loop_item_title', 'my_sold_out_loop' ); function my_sold_out_loop() { global $product; if ( !$product->is_in_stock() ) { echo '<span class="soldout">Нет в наличии</span>'; } } |
Текст появится в правом верхнем углу. Дополнительно для класса soldout сможете задать какой-то стиль:
span.soldout { padding: 3px 7px; background: #7b1616; color: white; font-size: 13px; } |
С помощью add_action допускается вставка данного бейджа в любое место Woocommerce шаблона, например, в единичное отображение продукции интернет-магазина:
add_action( 'woocommerce_before_single_product_summary', 'my_sold_out_loop' ); |
Меням надпись нет в наличии
Сниппет опять же вставляете в functions.php (или похожие файлы). Тем самым вы задаете 2 перевода для доступной продукции (Available) и распроданной (Sold Out). Если нужно что-то одно, можете просто убрать другой блок IF условия:
add_filter( 'woocommerce_get_availability', 'wcs_custom_get_availability', 1, 2); function wcs_custom_get_availability( $availability, $_product ) { if ( $_product->is_in_stock() ) { $availability['availability'] = __('Available!', 'woocommerce'); } if ( ! $_product->is_in_stock() ) { $availability['availability'] = __('Sold Out', 'woocommerce'); } return $availability; } |
Функция is_in_stock и наличие товара
Как вы могли догадаться из прошлого сниппета, is_in_stock является булевой функцией, то есть возвращает значения true/false. Следовательно вы можете использовать ее в условном операторе IF:
if ( $product->is_in_stock() ) { echo '<div class="stock" >' . $product->get_stock_quantity() . ' в наличии</div>'; } else { echo '<div class="out-of-stock" >Нет в наличии</div>'; } |
Выводите в Woocommerce фразу в наличии или нет для товара (в зависимости от его статуса) на страницах архива каталога:
function my_stock_loop() { global $product; if ( $product->is_in_stock() ) { echo '<div class="stock" >' . $product->get_stock_quantity() . ' в наличии</div>'; } else { echo '<div class="out-of-stock" >Нет в наличии</div>'; } } add_action( 'woocommerce_after_shop_loop_item_title', 'my_stock_loop' ); |
Надпись нет в наличии для цены
Возможно, это достаточно узкоспециализированная задача, но недавно мне нужно было вставить фразу об отсутствии товара не в качестве бейджа, а рядом с ценой. При этом я использовал несколько иное условия проверки:
add_filter( 'woocommerce_get_price_html', 'my_price_html', 100, 2 ); function my_price_html( $price, $product ){ global $product; $return_string = $price; if ( $product->stock_status == 'outofstock' ) { $return_string = $price .' (Нет в наличии)'; } return $return_string; } |
Здесь вместо функции is_in_stock просто считывал значение параметра $product->stock_status, и в случае когда оно равно «outofstock», дописывал соответствующую фразу к цене.
Важно! Во-первых, я не тестировал фишку с ценами вариаций товаров (у меня все были простые) — в статье по ссылке может видеть, что там используется другой фильтр woocommerce_variable_price_htm. Вполне вероятно, придется добавить срабатывание функции и для него. Также не забывайте, что есть еще sale_price. Во-вторых, изменения затрагивают и админку — если это критично, вставьте в функцию соответствующую проверку/условие.
Скрытие/вывод «пустых» подкатегорий на сайте
Данная фишка/задача актуальная, если в настройках WooCommerce рубрик у вас указано отображение не только товаров магазина, но и подкатегорий. При этом плагин по умолчанию не будет показывать разделы, которые не содержат ни единого элемента. Возможно, вам захочется данное поведение изменить.
В таком случае следует воспользоваться небольшим хаком, добавляете его в файл функций. В версии WooCommerce 3.х и выше он имеет вид:
add_filter( 'woocommerce_product_subcategories_hide_empty', 'hide_empty_categories', 10, 1 ); function hide_empty_categories ( $hide_empty ) { $hide_empty = FALSE; // You can add other logic here too return $hide_empty; } |
Для младших релизов модуля (до 3.x) следует использовать немного другой код:
add_filter( 'woocommerce_product_subcategories_hide_empty', 'show_empty_categories', 10, 1 ); function show_empty_categories ( $show_empty ) { $show_empty = TRUE; // You can add other logic here too return $show_empty; } |
Тестировал оба варианта сниппета — все работало.
Кстати, когда выводите список категорий с помощью виджета, то там пустые подрубрики можно скрывать через соответствующую настройку. А еще почитайте как убрать категории Woocommerce если надо избавиться от какого-то конкретного раздела.
Если вас интересует еще что-то по теме наличия товара Woocommerce, задавайте вопросы в комментариях. Позже допишу новые полезности и сниппеты, если найду интересные.
комментарий 31 к статье “Наличие товара в Woocommerce — настройки, хаки, надпись «Нет в наличии», функция is_in_stock и др.”
Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!
Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:
- Як сховати відсутні товари в Woocommerce шорткодах та схожих товарах
- Сервіс AdMaven + плагін для монетизації трафіка на WordPress сайтах
- Плагіни для створення стрічки новин з біжучим рядком в WordPress
- Як змінити розміщення кнопки оформлення замовлення в WooCommerce
- Плагін WHWS Display In Stock Products First – відображення товарів в наявності першими
- Підписка MonsterONE: чи варто використовувати цей сервіс у 2023 році? (+5 продуктів, які треба скачати в першу чергу)
- Онлайн генератор ссылок на мессенджеры для WordPress и не только
- WooCommerce (46)
- Безопасность (12)
- Видео (6)
- Виджеты (28)
- Возможности (141)
- Вопрос-ответ (6)
- Начинающим (52)
- Новости (46)
- Оптимизация (23)
- Плагины (246)
- Сервисы (87)
- Хаки и секреты (87)
- Шаблоны (45)
- Дизайн Мания - о веб-дизайне и не только.
- Tod's Blog - все про заработок онлайн.
- Вебдванольные заметки - обзоры веб-сервисов.
- Советы по выбору холодильника LG с технологией No Frost
- Зачем нужны Wi-Fi ретрансляторы и как выбрать подходящую модель
- Введение в онлайн-казино Slotor777: многообразие игр и привлекательные бонусы
- Необходимость использования облачного хранилища в наше время, что важно и как выгодно?
- Спрощення процесу звітності за допомогою програми BAS Бухгалтерія
- Технологія підключення інтернету GPON та її переваги
- За що гравці найбільше цінують Lineage 2
- Для каких проектов нужна аренда виртуального сервера и что такое VPS
Очередная порция сниппетов подъехала)) спс за труды!
Roman, не за что) По сути, я и для себя их тоже фиксирую, дабы потом в работе повторно использовать.
Как раз изучаю Woocomerce, хороший у вас блог))
Антон, спасибо, стараюсь)
Хак для пустых подкатегорий помог, tnx!
Danka, не за что)
Здравствуйте. Подскажите пожалуйста как сделать вывод бейджа «Нет в наличии» для вариативного товара?
Darfkire, а прием из статьи не работает? мне казалось бейдж появляется и в обычных товарах, и в вариативных. Если нет, надо гуглить где-то код, у меня в теме, к счастью, все работало изначально.
Tod, ты привязываешься к параметру in_stock, но для вариативного товара он положительный, хотя все вариации выключены. Потому твой код не работает. Если подстраивается под твой код, то мне нужно самому определять выключены все вариации или нет и задавать параметр false для in_stock. Но как это красиво сделать -я не знаю.
Tod, все я разобрался. Твой код работает. Моя ошибка была в том что я выключал вариации таким кодом:
$data = [
‘visible’ => false
];
$wooeto->put(«products/{$v1->id}/variations/{$v2->id}», $data);
То есть я скрывал товар, а нужно было было передавать массив $data = [
‘in_stock’ => false
];
И тогда Woocomerce все нормально пересчитает и сам изменяет in_stock для всего товара и твой код работает.
Darkfire, гуглил что-то типа woocommerce is_in_stock variable — вроде есть парочка статей/сниппетов, которые нужно тестить у себя. Похоже, что действительно с вариациями не все гладко.
закинул код на вывод товара в наличии в категории но не показывает…
Тимофей, нужно тестить: пробовать сначала часть кода, смотреть как выводится в общем магазине, установить шаблон по-умолчанию (тема иногда вносит свои коррективны) и т.п.
Добрый вечер! Подскажите пожалуйста, как поменять надпись нет в наличии на уточняйте у менеджера?
Анна, я бы сначала попробовал первые два хака, которые описаны в статье. Как альтернатива можно добраться до переводов через Poedit (для магазина они вроде бы тут wp-content/languages/plugins) либо переводил бы с помощью функции gettext.
Не подскажете как сделать товар всегда в наличии,даже если он закончился??Точнее сделать так,чтобы товары были всегда в наличии и все?
Илья, изначально в Woocommerce все товары в наличии без каких-то подсчетов остатка на складке и т.у. То есть, если вы вручную в админке не будете указывать, что товара нет, то пользователь никогда не увидит соответствующее сообщение.
Как вариант можно просто перестать отображать информацию о наличии товара или погуглить что-то вроде «woocommerce always in stock», где есть парочка статей/решений по теме. Но опять же, если в админке «нет на складе» не выбрано, то на сайте товар всегда в наличии.
Спасибо за статью, подскажите, можно ли изображения товаров не в наличии сделать черно белыми?
Петр, думаю, да.. я бы глянул CSS классы, которые присваиваются данным товарам — мне кажется, там какие-то дополнительные стили дописываются. А потом к ним применяется фильтр.
Может кто поможет? нужно в админке вывести цифру только для админа.
Цифра состоит из: формула этой цифры: (себестоимость(YITH Cost of Good плагин используется) 1-го товара умножить на его количество) и сложить со все товарами(соответственно перемноженного на количество), только с теми которые в наличии. Это фича нужна для понимать сколько денег вложено в товар который в наличии.
Все работает, однако почему-то на стартовой странице, где выводятся «Последние товары», сниппет не работает, странно.
Долго копал и думал что вообще не работает, пока не наткнулся на эту засаду.
В «Магазине» работает, на главной странице в «Последних товарах» не выводит ((((
Иван, вероятно оно как-то по разному выводит информацию, хотя add_action все равно, по идее, должен срабатывать… нужно гуглить решение, возможно, там есть еще какие фильтры/action’ы.
Отличная статья! очень помогла! Большое спасибо!
Здравствуйте.
Очень полезная статья, спасибо. Но остался вопрос, который в ней не указан.
Когда товара не в наличии, то можно добавить надпись «Нет в наличии» где указана цена.
Подскажите, а как эту надпись указать вместо цены на товарах имеющих параметр (Видимость в каталоге = «Скрыто»).
И попробую немного понаглеть и задать второй вопрос)) С помощью шорткода выводится группа товаров. Отлично! Но как исключить из этого списка те товары, которых нет в наличии?
Заранее спасибо.
Илья, сори за поздний ответ, но к сожалению, схожу не вспомню ответы на ваши вопросы — нужно гуглить) Думаю, в сети должны быть подходящие сниппеты.
А не подскажете ли как вообще убрать надпись «Нет на складе»? чтобы вообще этого в каталоге на товарах не отображалось
Фаниль, проще всего через CSS стили — посмотреть какой там класс у этой надписи и добавить display: none;
Доброго дня! А как вывести в поиск данные статусы, причем все? Они у меня переименованы и используются . Напишите, если делали.
Ксения, тут нужно разобраться с файлами шаблона, которые отвечают за отображение тех или иных страниц — у каждого шаблона они могут отличаться. Можете попробовать коды из данной статьи применить и посмотреть, что получится.
Сегодня попробовал вывести нет в наличии для темы kadence используя код «Бейдж нет в наличии в Woocommerce»
Однако он не сработал.
Уточните почему есть добавить бейдж и есть заменить текст? По умолчанию он должен выводиться, подскажите пожалуйста