В этом уроке я покажу как сделать две вещи:
Также хочу напомнить, что у меня на сайте есть видеокурс по WooCommerce, в котором мы с нуля создаём тему для интернет-магазина на основе готовой вёрстки 🚀
Сначала давайте попробуем отсортировать товары при помощи добавления хука в functions.php
без создания опций сортировки. Я не исключаю того, что вы мастерски владеете хуком pre_get_posts, но я не публиковал бы этот пост, если бы не хотел показать вам какой-то интересный фильтр-хук именно Вукомерса. И это – woocommerce_get_catalog_ordering_args
.
add_filter( 'woocommerce_get_catalog_ordering_args', 'truemisha_sort_by_stock', 25 ); function truemisha_sort_by_stock( $args ) { $args[ 'meta_key' ] = '_stock_status'; $args[ 'orderby' ] = 'meta_value'; $args[ 'order' ] = 'ASC'; return $args; }
Так как у меня уже есть на сайте подробнейший урок про опции сортировки, то сейчас я не буду уходить слишком глубоко в детали, а вот готовый код:
/* * Добавление опции сортировки */ add_filter( 'woocommerce_default_catalog_orderby_options', 'truemisha_new_orderby_option', 25 ); add_filter( 'woocommerce_catalog_orderby', 'truemisha_new_orderby_option', 25 ); function truemisha_new_orderby_option( $sortby ) { $sortby[ 'vnalichii' ] = 'Сначала товары в наличии'; return $sortby; } /* * Осуществление сортировки */ add_filter( 'woocommerce_get_catalog_ordering_args', 'truemisha_sort_by_stock', 25 ); function truemisha_sort_by_stock( $args ) { if ( isset( $_GET['orderby'] ) && 'vnalichii' == $_GET['orderby'] ) { $args[ 'meta_key' ] = '_stock_status'; $args[ 'orderby' ] = 'meta_value'; $args[ 'order' ] = 'ASC'; } return $args; }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
О! Спасибо!)
А если требуется добавить несколько условий, например сортировка по цене и наличию, то есть сначала товары что в наличии но и также отсортированы по цене (дешевые), как в таком случае должно выглядеть условие?
Можете попробовать примерно это:
У меня правда нет уверенности, что такой мета квери сработает для
woocommerce_get_catalog_ordering_args
, но можете попробовать.Здравствуйте.
К сожалению тоже столкнулся с такой проблемой, что нужно по двум мета-полям сделать сортировку, но такой вариант не срабатывает. Может еще встречались с такой проблемой, и решение нашлось?
Здравствуйте!
Похоже, что
woocommerce_get_catalog_ordering_args
поддерживает толькоmeta_key
,order
иorderby
.Добрый день. Не подскажите а как сортировать по атрибутам? Например по таким "Электрическая мощность"
Добрый день!
Могу ошибаться, но один из вариантов – это сохранение нужного атрибута в метаданные товара на
save_post
, а потом сортировка по meta_query.Добрый вечер, подскажите пожалуйста, Можно сделать что выводились товары только в наличии?)
Добрый вечер, конечно!
Спасибо огромное!!))
Пожалуйста! :)
Спасибо
Михаил, спасибо, код работает, но он сломал фильтр "latest products", все остальные сортировки работают, а по последним товарам сортировка больше не хочет. можно это как-то исправить, или либо сортировка по наличию, либо по последним добавленным? Мне бы надо еще иметь возможность на сайте отдельно витрину с новыми поступлениями. бы:) Заранее спасибо!
Огромное спасибо, очень интересный урок.
Хочу реализовать, интересны по моему мнению, функционал у себя в магазине, но технических навыков пока что не достает. И в свете этого, вопрос - Подскажите пожалуйста, как сделать чтобы товары без фотографий были в конце списка и еще чтобы товары не в наличии были полупрозрачными? Буду благодарен любой помощи.
И большое спасибо Михаилу за такие не шаблонные и интересные материалы, аналогов которых в интернете чаще всего нет.
Спасибо вам за тёплые слова!
По первому вопросу у меня к сожалению нет готового кода и пока что вам ничего не смогу подсказать. Но могу предложить ручную сортировку конечно же в админке, если у вас не слишком много товаров.
По второму вопросу чуть легче, товары не в наличии в каталоге по умолчанию имеют CSS-класс
outofstock
, поэтому вот такой CSS-код может вам помочь:Вставить его можно например во Внешний вид > Настроить > Дополнительный CSS
Добрый день! Большое спасибо за полезную статью.
У себя на сайте столкнулся с проблемой.
У части товара цену установлена "0". И на сайте вместо нулевой цены пишется текст "Позвоните нам".
Стандартная сортировка товара в каталогах по цене от меньшей к большей.
И из-за того что у части товара фактически цена "0" такие товары отображаются первыми.
Можно ли сделать так чтобы сортировка по цене так и осталась от меньшего к большему, но товары с "0" ценой отображались последними?
Сейчас так:
Product A - (цена = 0) call for price
Product B - (цена = 0) call for price
Product C - 2$
Product D - 7$
Product E - 31$
Нужно так:
Product C - 2$
Product D - 7$
Product E - 31$
Product A - (цена = 0) call for price
Product B - (цена = 0) call for price
Кто-то на stackoverflow столкнулся с похожей проблемой предложил подобный код, но он не работает:
https://stackoverflow.com/questions/61226673/woocommerce-sort-by-price-products-without-prices-at-the-end
Сломал голову с этой проблемой, так и не нашёл решения.
Добрый день! Увы, готового кода у меня тоже нет, но могу предложить перенаправить ваш вопрос в команду, ребята вам всё сделают 🔥
Привет Миша, все рабоет но есть ньюанс. Несмотря на то что в настройках woocommerce сортировка по умолчанию установленна кастомная "Сначала товары в наличии", архив по прежнему выдаёт товары в порядке по алфавиту, хотя даже в окне сортировки над товарами указана кастомная. Только после того как в архиве ты поменяешь сортировку на любую из дефолтных, а потом обратно на кастомную, все начинает рабоать. В чем прикол?