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

В одном из своих видеоуроков я рассказывал, по какому принципу в 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;
 
}

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.