В этом уроке я хочу поделиться с вами сниппетом кода, который позволит вам вывести диапазон цен рядом с каждой категорией товара.
Если у вас возникают вопросы относительно того, где эту страницу найти, то вы можете создать её при помощи шорткода например.
Также хочу порекомендовать вам свой видеокурс по WooCommerce, в котором мы учимся создавать тему для интернет-магазина с нуля на основе готовой HTML-вёрстки.
Итак, а вот готовый код:
/** * @snippet Диапазон цен в категориях товаров * @author Миша Рудрастых * @url https://misha.agency/woocommerce/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>'; } }
Не знаете, куда вставлять код?
fields=ids
, для того, чтобы не получать всю информацию из таблицы wp_posts за ненадобностью. Цикл WP_Query также подошёл бы сюда прекрасно.PHP_FLOAT_MAX
, которая содержит в себе максимально большое число с плавающей запятой. Мы могли бы обойтись и без неё, но тогда бы нам понадобилось переписать немного наши условия.$product->get_variation_prices()
, который позволяет получить массив цен всех вариаций товара уже с учётом их сортировки от самой маленькой до самой большой цены! Потрясающе. current()
получает первый элемент массива, функция end()
– последний.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.