Home » WooCommerce: Product Category Price Range

WooCommerce: Product Category Price Range

by Tutor Aspire

WooCommerce variable products display a price range by default, which goes something like this: $MIN-$MAX. Now, wouldn’t it be nice, on the Shop page or Category Widget, to show the price range for each category?

Well, as usual this is a customization that can apply to certain online businesses only, so hopefully you’re one of them. Either way, this is yet another chance for you to learn PHP applied to WooCommerce. Enjoy!

Here’s a nice snippet to show MIN and MAX prices for any given WooCommerce product category

PHP Snippet: Show Price Range Beside Product Category Names @ Shop Page

Note: this snippet replaces the the category product counter with the price range. In case you wish to display both, code changes slightly.

/**
 * @snippet       Product Category Price Range @ WooCommerce Shop
 * @how-to        Get tutoraspire.com FREE
 * @author        Tutor Aspire
 * @compatible    WooCommerce 5
 * @donate $9     https://www.tutoraspire.com
 */

add_filter( 'woocommerce_subcategory_count_html', 'tutoraspire_category_price_range', 9999, 2 );

function tutoraspire_category_price_range( $html, $category ) {

$min = PHP_FLOAT_MAX;
$max = 0.00;

$all_ids = get_posts( array(
'post_type' => 'product',
'numberposts' => -1,
'post_status' => 'publish',
'fields' => 'ids',
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $category->slug,
),
array(
'taxonomy' => 'product_visibility',
'field' => 'name',
'terms' => 'exclude-from-catalog',
        'operator' => 'NOT IN',
),
)
) );

foreach ( $all_ids as $id ) {
$product = wc_get_product( $id );
if ( $product->is_type( 'simple' ) ) {
$min = $product->get_price() get_price() : $min;
$max = $product->get_price() > $max ? $product->get_price() : $max;
} elseif ( $product->is_type( 'variable' ) ) {
$prices = $product->get_variation_prices();
$min = current( $prices['price'] )  $max ? end( $prices['price'] ) : $max;
} 
}

return ' (' . wc_format_price_range( $min, $max ) . ')';
}

You may also like