Добавление или удаление доступных опций сортировки товаров

В одном из своих видеоуроков я рассказывал, по какому принципу в WooCommerce работает сортировка товаров. Я имею ввиду вот это:

Сортировка товаров в WooCommerce

Как видите, в возможности сортировки по умолчанию входят:

  • По популярности
  • По рейтингу
  • По новизне
  • Цена по убыванию
  • Цена по возрастанию

А что, если нам нужно добавить ещё что-то? Давайте в качестве примере добавим «в случайном порядке», мне трудно представить, когда это может быть нужно, но ведь мы хотим понять сам принцип работы этого.

Шаг 1. Добавляем новую опцию в выпадающий список

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, поэтому сразу переходим ко второму шагу.

Шаг 2. Применяем сортировку

Тут всё происходит в пределах одного хука 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;
 
}

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 14

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал