В одном из своих видеоуроков я рассказывал, по какому принципу в WooCommerce работает сортировка товаров. Я имею ввиду вот это:
Как видите, в возможности сортировки по умолчанию входят:
А что, если нам нужно добавить ещё что-то? Давайте в качестве примере добавим «в случайном порядке», мне трудно представить, когда это может быть нужно, но ведь мы хотим понять сам принцип работы этого.
add_filter( 'woocommerce_default_catalog_orderby_options', 'truemisha_custom_orderby_option' ); add_filter( 'woocommerce_catalog_orderby', 'truemisha_custom_orderby_option' ); function truemisha_custom_orderby_option( $sortby ) { $sortby['randomly'] = 'В случайном порядке'; return $sortby; }
В итоге:
Понятное дело, что на этом этапе сортировка не будет работать, у нас только в URL будет добавляться ?orderby=randomly
, поэтому сразу переходим ко второму шагу.
Тут всё происходит в пределах одного хука woocommerce_get_catalog_ordering_args
, и по названию уже можно догадаться, что мы меняем у него параметры для WP_Query товаров.
add_filter( 'woocommerce_get_catalog_ordering_args', 'truemisha_random_order' ); function truemisha_random_order( $args ) { if ( isset( $_GET['orderby'] ) && 'randomly' == $_GET['orderby'] ) { $args['orderby'] = 'rand'; } return $args; }
Я думаю, что те из вас, кто уже работает какое-то время с хуками WordPress, уже после первого примера поняли, как удалять опции сортировки или даже менять их местами.
Дело в том, что внутри фильтров woocommerce_default_catalog_orderby_options
и woocommerce_catalog_orderby
доступна переменная, которая является массивом из всех опций сортировки. И если это массив, то мы можем легко его распечатать через print_r()
, удалить элемент – unset()
и тд.
Например попробуем удалить все опции сортировки кроме нашей рандомной:
add_filter( 'woocommerce_default_catalog_orderby_options', 'truemisha_remove_orderby_options' ); add_filter( 'woocommerce_catalog_orderby', 'truemisha_remove_orderby_options' ); function truemisha_remove_orderby_options( $sortby ) { unset( $sortby[ 'popularity' ] ); // по популярности unset( $sortby[ 'rating' ] ); // по рейтингу unset( $sortby[ 'date' ] ); // Сортировка по более позднему unset( $sortby[ 'price' ] ); // Цены: по возрастанию unset( $sortby[ 'price-desc' ] ); // Цены: по убыванию return $sortby; }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Большое спасибо за твой труд. Блог просто кладезь знаний по wp.
И если можно, небольшой вопросик - а как сделать, чтобы сортировка не сбрасывалась при переходе в другую категорию?
Пожалуйста! Очень приятно это слышать :)
Думаю тут можно поколдовать с фильтром
term_link
, примерно:Код не тестировал, написал сходу. Обязательно отпишите, сработало или нет.
Большое спасибо за ответ. Работает отлично. Код можно юзать)
🌪⚡️🔥
А товары при рандомной сортировке не будут таким же случайным образом повторяться на страницах пагинации?
Для этого нужно seed в сессию записать. Примерно так:
А как сделать чтобы сортировка была по возрастанию цены и в алфавитном порядке?
Спасибо! Кастомная сортировка товаров - отличная тема. Подскажите, пожалуйста, а как добавить сортировку, чтобы выводились товары по принципу "максимальная скидка"?
Всегда пожалуйста!
Конечно, вот урок про это.
Ура! Спасибы!!!
Здравствуйте Миша! Спасибо за ваши труды, все очень просто и доходчиво!
У меня вопрос насчет сортировки по популярным товарам на главной странице. WC сортирует их по количеству проданных товаров, а хотелось бы сортировать по заказам. Например в одном заказе может быть заказан один и тот же товар в большом количестве, например есть заказ, в котором заказали ролики 10 шт., а в других 5 заказах самокаты по 1-й штуке. В данном случае популярным товарам являются самокаты, а WC выдает ролики.
Как можно сделать сортировку по количеству заказов товара, а не по количеству самих товаров и заказах?
Здравствуйте!
Пожалуйста, очень рад :)
С этой задачей не сталкивался к сожалению...
Михаил здравствуйте.
Можно ли сделать сортировку списка товаров woocommerce по двум или более кастомным полям. Например, нужно сначала вывести товары со знаком качества по мета-полю 'quality_mark', а затем остальные ниже отсортировать по мета-полю рейтинга 'product_rating'. Если возможно это сделать за отдельную плату, то как связаться с вами, и сколько это будет стоить.
Здравствуйте!
Теоретически это можно сделать, но не при помощи
woocommerce_get_catalog_ordering_args
, там можно только по одному мета-полю.