Отображаем диапазон цен в категориях товаров

В этом уроке я хочу поделиться с вами сниппетом кода, который позволит вам вывести диапазон цен рядом с каждой категорией товара.

Вместо количества товаров в категории товара WooCommerce, выводим диапазон цен
Вместо количества товаров в категориях WooCommerce, выводим диапазон цен товаров, находящихся в них.

Если у вас возникают вопросы относительно того, где эту страницу найти, то вы можете создать её при помощи шорткода например.

Также хочу порекомендовать вам свой видеокурс по WooCommerce, в котором мы учимся создавать тему для интернет-магазина с нуля на основе готовой HTML-вёрстки.

Итак, а вот готовый код:

/**
 * @snippet       Диапазон цен в категориях товаров
 * @author        Миша Рудрастых
 * @url           https://misha.agency/wordpress/otobrazhaem-diapazon-czen-v-kategoriyah-tovarov.html
 */
add_filter( 'woocommerce_subcategory_count_html', 'true_category_price_range', 25, 2 );
 
function true_category_price_range( $html, $product_category ) {
 
	// давайте сейчас запустим цикл по всем товарам и вычислим минимальную и максимальную цену
	$product_ids = get_posts( array(
		'post_type' => 'product',
		'posts_per_page' => -1,
		'post_status' => 'publish',
		'fields' => 'ids',
		'tax_query' => array(
			'relation' => 'AND',
			array(
				'taxonomy' => 'product_cat',
				'field' => 'slug',
				'terms' => $product_category->slug,
			),
			array(
				'taxonomy' => 'product_visibility',
				'field' => 'name',
				'terms' => 'exclude-from-catalog',
				'operator' => 'NOT IN',
			),
		)
	) );
 
	// если товаров в категории нет, то возвращаем ничего
	if( ! $product_ids ) {
		return;
	}
 
	// окей, товары значит есть, пройдёмся по ним циклом и вычислим минимальное и максимальное значение
	$min = PHP_FLOAT_MAX;
	$max = 0;
 
	foreach ( $product_ids as $product_id ) {
		// получим объект товара из его ID
		$product = wc_get_product( $product_id );
		// если товар простой
		if ( $product->is_type( 'simple' ) ) {
			// получаем цену
			$product_price = $product->get_price();
			// вычисляем минимальное
			$min = $product_price < $min ? $product_price : $min;
			// вычисляем максимальное
			$max = $product_price > $max ? $product_price : $max;
 
		// если товар вариативный, то тут можно слегка заморочиться
		} elseif ( $product->is_type( 'variable' ) ) {
			// получаем массив цен вариаций этого товара, уже отсортированных!
			$prices = $product->get_variation_prices();
			// вычисляем минимальное
			$min = current( $prices[ 'price' ] ) < $min ? current( $prices[ 'price' ] ) : $min;
			// вычисляем максимальное
			$max = end( $prices[ 'price' ] ) > $max ? end( $prices[ 'price' ] ) : $max;
		}
	}
 
	// финальная проверка, если существуют мин и макс, то выводим
	if( $min && $max ) {
		return ' <strong>(' . wc_format_price_range( $min, $max ) . ')</strong>';
	}
 
}

Не знаете, куда вставлять код?

  • Для получения списка товаров мы использовали функцию get_posts() и с параметром fields=ids, для того, чтобы не получать всю информацию из таблицы wp_posts за ненадобностью. Цикл WP_Query также подошёл бы сюда прекрасно.
  • В качестве минимальной цены товара я задал PHP-константу PHP_FLOAT_MAX, которая содержит в себе максимально большое число с плавающей запятой. Мы могли бы обойтись и без неё, но тогда бы нам понадобилось переписать немного наши условия.
  • Обратите внимание, что для вариативных товаров условие немного отличается, я использовал метод $product->get_variation_prices(), который позволяет получить массив цен всех вариаций товара уже с учётом их сортировки от самой маленькой до самой большой цены! Потрясающе.
  • PHP-функция current() получает первый элемент массива, функция end() – последний.
  • И ещё один немаловажный момент, я исключил из цикла товары, который скрыты из каталога. Это прописано на строчках 23-28, а подробнее описано в этом уроке.

Миша

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

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

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.