В одном из своих видеоуроков я рассказывал, по какому принципу в 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 в сессию записать. Примерно так:
А как сделать чтобы сортировка была по возрастанию цены и в алфавитном порядке?
Спасибо! Кастомная сортировка товаров - отличная тема. Подскажите, пожалуйста, а как добавить сортировку, чтобы выводились товары по принципу "максимальная скидка"?
Всегда пожалуйста!
Конечно, вот урок про это.
Ура! Спасибы!!!