Если мы говорим про цены вариативных товаров WooCommerce, то по умолчанию они отображаются в виде диапазона «минимальная цена – максимальная», вот пример:
Но что, если такой формат отображения цен не всегда удобен для нас. Даже на скриншоте вы можете заметить, что цена немного не помещается на одной строчке. Ведь можно сделать отображение в виде «от минимальная цена».
Вот так:
Делается это не очень сложно, но есть несколько моментов, которые нужно учесть и я расскажу о них позже. Для начала взгляните на этот сниппет кода, который можно отправить в functions.php
вашей текущей темы:
add_filter( 'woocommerce_variable_price_html', 'truemisha_variation_price', 20, 2 ); function truemisha_variation_price( $price, $product ) { $min_regular_price = $product->get_variation_regular_price( 'min', true ); $min_sale_price = $product->get_variation_sale_price( 'min', true ); $max_regular_price = $product->get_variation_regular_price( 'max', true ); $max_sale_price = $product->get_variation_sale_price( 'max', true ); if ( ! ( $min_regular_price == $max_regular_price && $min_sale_price == $max_sale_price ) ) { if ( $min_sale_price < $min_regular_price ) { $price = sprintf( 'от <del>%1$s</del><ins>%2$s</ins>', wc_price( $min_regular_price ), wc_price( $min_sale_price ) ); } else { $price = sprintf( 'от %1$s', wc_price( $min_regular_price ) ); } } return $price; }
И ещё кое-что, если вы хотите научиться изменять WooCommerce не только на уровне вставки готовых сниппетов в код, то рекомендую вам мой видеокурс.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Спасибо за статью!
Буду ждать описания моментов, которые нужно учесть)
Спасибо огромное добрый человек!
Работает!
Есть только один нюанс... цена как отображалась в несколько строчек (в 3 строчки если быть точным) - так и продолжает отображаться
Было -> Стало
100р
- от
200р 200р
Можешь плииз дать направление - куда копать? ))
Да, пожалуйста!
Ну у вас есть два варианта – либо заменить пробелы на неразрывные
, либо использовать CSS-свойствоwhite-space:nowrap
.Спасибо за ответ!
Прошу пардона что вот так сразу вульгарно на Ты )) это я не со зла.
К сожалению не сработало. От темы это тоже не зависит (пробовал на разных)
А где формируется вывод вариативных ценников у WooCommerce? (в каком Php-файле/в какой функции)
Относительно Ты – ничего страшного )
хм.. если не сработало, то я возможно не до конца понял вопрос 🤔
Сорри за мой корявый экспланейшн... с php/wordpress'ом и вот этим всем я сильно на Вы)))
попробую объяснить еще раз...
Имеется вариативный товар. Допустим ценой 100 и 300 руб. Помимо того, что диапазон цен 100-300 сбивает с толку... Цена еще и отображалась в 3 строчки, что очень не эстетично и ваще ацтой. Ваше решение казалось панацеей от этой проблемы (ремарка: как мне показалось с моей ламерской колокольни, ваше решение - наиболее продуманное из всех подобных решений для вариативных товаров, что встречал в интернетах... например у Вас учитывается момент с одинаковой ценой вариативных товаров... есть 2 отдельных вывода для распродажи и обычной цены... и.т.д. есть только вопрос - как будут работать фильтры по цене... но у меня таковых пока не предвидится...)
Дык вот (возвращаясь к моим баранам...)
Было (строчки пронумерованы)
1. 100р
2. -
3. 300р
После модификации стало (строчки пронумерованы)
1.
2. от
3. 100р
Все те же 3 строчки...
Менял тему - тоже самое.
Начинаю думать что нужно еще что-то подкрутить в выводе вариативной цены у Вуукоммерса.
Из того что пробовал...
- не работает точно...
насчет CSS... попробовал обернуть в кастом CSS стиль вывод функции но возможно что-то сделал не так... можно ли попросить о примере кода?
поправка
не работает точно )Ну это же всё равно в одном HTML-теге верно?
"1.
2. от
3. 100р"
Если между от и рублями поставить неразрывный пробел
, то точно должно работать 🤔🤷♂️ ну или прописать в CSSwhite-space:nowrap
для того самого тега.Так что странно.
>Ну это же всё равно в одном HTML-теге верно?
А вот не знаю, сорри... имхо это зависит от того как организован вывод варриативной цены у WooCommerce и как работает
sprintf( 'от %1$s', wc_price( $min_regular_price ))
Мои ламерские домыслы: может есть более приоритетный стиль от WooCommerce который применяется в данном случае... или вывод цены у WooCommerce организован так что есть принудительный перевод строки для слова
ну т.е. мое предположение, что может
min_regular_price
уже возвращается с пробелами или знаком переноса строки. И совсем не понятно откуда берется первая пустая строка.Ну то есть так пробовали и не сработало?
sprintf( 'от %1$s',
да))
Фак) ну странно короче, если хотите, напишите в форму, я могу дать контакт одного из наших разработчиков, он вам за небольшое вознаграждение думаю поможет
А как потом стилизовать эту приставку "От". Она не html тегах и я не могу увеличить её размер, если название фильтра содержит price_html, может можно вернуть слово в тегах?
Да, можно конечно, рекомендую тег span.
Добрый день, а можно это показать для новичков уже в вашем примере которое было выложено ранее вверху
Добрый,
Да, конечно:
sprintf( '<span>от</span> %1$s', ...
Спасибо за статью. Для новичка самое то. Хотя и не это искал.
А как запросить все цены (не только мин и макс) и все их вывести?
Нашел в плагине дедуктивным способом файл: price.php и вот Ваш способ. Как лучше?
И при обновлении плагина или темы у меня все пропадет??? Если да - АбиднА!
Просто человеческое спасибо за Ваш труд. А ответы на новые вопросы: как будет угодно.
Пожалуйста, не совсем понял ваш вопрос про цены 🤔 Чтобы код не пропадал, вставляйте его либо в дочернюю тему, либо создайте плагин.
Этот хук ко всем товарам, а как сделать к товару по ID ? Спасибо! )
Пожалуйста :)
Миша, приветствую! Буду очень признателен если подскажите, как полностью убрать вывод вариативности цены "от и до"? Чтобы осталась только фактическая цена варианта товара.
Приветствую Андрей,
А какого конкретно варианта?
Миша, уже решил. Спасибо, что откликнулись!
Супер, и cпасибо, что поделились кодом!
Андрей, привет!
Тоже нужно было сделать то, что ты сделал! Вставил код и цена от-до ушла, осталась отображаться цена конкретного варианта товара, но как её поместить на место цены от-до?
Спасибо!
Михаил добрый день.
Подскажите пожалуйста. У меня такой вариант:
Есть товар с вариациями, цена на 1-у штуку 95 крон, на 3-и цена 190 крон, на 6-ть 304 кроны.
Соответственно логично выводить цену наименьшую, но не 95 крон, а 51 крону (если человек покупает сразу 6 штук). Вот пример: https://montbleu.store/product/middle-transparent-glass-nail-file/
Как правильно поправить код, что бы выводилась в магазине цена 51 крона.
Спасибо.
Добрый день!
Думаю, что вам нужно
$product->get_variation_regular_price( 'min', true );
.Доброго времени
Подскажите пжлс как сделать такой формат цены у обычного товара, не вариативного http://prntscr.com/1281thj
То есть,
перечеркнутая - основная цена,
оранжевая - цена по акции,
между ними сумма экономии (основная цена - цена по акции = экономия)
За ранее огромное спасибо!
Добрый день,
Можете попробовать фильтр-хук
woocommerce_get_price_html
.Михаил, спасибо за ответ!
По вашей наводке и поиском в гугле получилось сделать следующее:
Работает как нужно, но есть пару моментов с которыми не могу разобрать, буду рад если сможете помочь!
1) у цен не правильно отображаются десятичные цифры, в админке выставлено 2 числа после точки, то есть так 100.11.
Сейчас отображается столько десятичных, сколько ввел в админке, например в админке 100.11111 и на сайте отобразится 100.11111.
Если ввел 100, то и отобразится 100, а нужно 100.00
2) этот вопрос наверное будет глупым, но не судите строго первый магазин на wc)
как сделать чтобы этот фильтр применялся только к товару, в категории и корзине будет другой формат?! Сейчас этот фильтр применяется ко всему сайту.
За ранее спасибо!
Миша, добрый день. Все работает спасибо.
Пробую сделать такой вариант на Woo, чтобы стояла цена за 1 кв.м., но в корзину падало пропорционально упаковкам (а в упаковке может быть и 0.84 и 1.44 кв.м.)
Как здесь например. Подскажи пожалуйста более лучшее решение, чем вариативный товар )
Я сделал вариацию на 1 кв.м. (сделал, что товара нет в наличии) и вариацию на 1.44 кв.м. как приоритетную, но выглядит это не очень, да и забивать не очень удобно, а особенно в дальнейшем цены менять.
Добрый день!
Интересная задача, рекомендую взглянуть на этот урок и на этот, надеюсь, помогут или направят в нужное направление 🙏🏼
Михаил, спасибо большое! Все работает! А я уж было плагины начала искать для решения этой задачи
Здравствуйте Михаил,
Это интересное решение, но у меня задача посложнее. Передо мной стоит задача отобразить 3 варианта цены на одну услугу строками на странице одного товара. При этом сниженные цены и обычные цены на пару должны быть видны только когда пользователь авторизовался. Для гостей сайта видны только обычные цены.
Итак, как это выглядит на странице одного товара:
1. За Атрибут 1: 50.50 р. - 60 р. (вторая цена перечеркнута)
2. За Атрибут 2: 1.50 р. - 2 р.
3. За Атрибут 3: 404 р. - 480 р.
4. 1.50 р. - 404 р. или 2 р. - 480 р.
Как это должно выглядеть на странице архива товаров:
только в виде диапазона 1.50 р. - 404 р. или 2 р. - 480 р. (еще можно рассмотреть вариант если в архиве товаров будет отображаться вместо диапазона кнопка Цена, при нажатии на которую будет всплывать окно с ценами).
Что я смог сделать:
1. Я смог вывести атрибуты на страницу товаров, но они также стали отображаться и в архиве товаров, где их быть не должно, либо по условиям выше.
2. Перечеркнутые цены со скидками видны только в простом товаре, в вариативном все еще отображаются только минимальные, в зависимости от того, авторизовался ли пользователь.
Я новичок в этой теме, все это смог набросать с помощью кодов доступных в сети. Подскажите пожалуйста что я упустил?
Прошу прощения, забыл уточнить, это сайт каталог с отключенной корзиной на базе woocommerce.
Здравствуйте, спасибо большое за то, что подробно расписали свою задачу. Тут наверное сходу не смогу подсказать, сорри, нужно тестировать ваш код. Либо могу предложить обратиться за помощью в нашу команду...
Спасибо, работает просто шикарно) Выручили!
Супер! :)
Здравствуйте, большое спасибо за готовое решение!
Могли бы вы подсказать как сделать подобные изменения только на странице товара, то есть чтобы в каталоге цена была от и до, а на странице товара - как в примере. Понимаю что нужно добавить дополнительно if, но не понимаю куда)
Благодарю вас!
Удалось сделать, добавив дополнительно if ( is_product() )
Надеюсь верно)
Подскажите пожалуйста, как сделать так, чтобы код срабатывал только на странице товара и только в цене этого товара. Если делать условием всю страницу товара - так же убирается интервал и на рекомендуемых товарах или апсейлах)
Здравствуйте,
теоретически можно попробовать следующее условие:
if( is_product() && get_queried_object_id() == $product->get_id() ) {
Огромное спасибо, добрый человек)
На первый взгляд все работает хорошо
Супер, я рад! 🔥