Automattic\WooCommerce\Internal\ProductFilters

FilterData::get_rating_countspublicWC 1.0

Get rating counts for the current products.

Method of the class: FilterData{}

Returns

Array. rating=>count pairs.

Usage

$FilterData = new FilterData();
$FilterData->get_rating_counts( $query_vars );
$query_vars(array) (required)
The WP_Query arguments.

FilterData::get_rating_counts() code WC 10.3.3

public function get_rating_counts( array $query_vars ) {
	/**
	 * Filter the data. @see get_filtered_price() for full documentation.
	 */
	$pre_filter_counts = apply_filters( 'woocommerce_pre_product_filter_data', null, 'rating', $query_vars, array() ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingSinceComment

	if ( is_array( $pre_filter_counts ) ) {
		return $pre_filter_counts;
	}

	$transient_key = $this->get_transient_key( $query_vars, 'rating' );
	$cached_data   = $this->get_cache( $transient_key );

	if ( ! empty( $cached_data ) ) {
		return $cached_data;
	}

	$results     = array();
	$product_ids = $this->get_cached_product_ids( $query_vars );

	if ( $product_ids ) {
		global $wpdb;

		$rating_count_sql = "
			SELECT COUNT( DISTINCT product_id ) as product_count, ROUND( average_rating, 0 ) as rounded_average_rating
			FROM {$wpdb->wc_product_meta_lookup}
			WHERE product_id IN ( {$product_ids} )
			AND average_rating > 0
			GROUP BY rounded_average_rating
			ORDER BY rounded_average_rating DESC
		";

		/**
		* We can't use $wpdb->prepare() here because using %s with
		* $wpdb->prepare() for a subquery won't work as it will escape the
		* SQL query.
		* We're using the query as is, same as Core does.
		*/
		// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
		$results = $wpdb->get_results( $rating_count_sql );
		$results = array_map( 'absint', wp_list_pluck( $results, 'product_count', 'rounded_average_rating' ) );
	}

	/**
	 * Filter the results. @see get_filtered_price() for full documentation.
	 */
	$results = apply_filters( 'woocommerce_product_filter_data', $results, 'rating', $query_vars, array() ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingSinceComment

	$this->set_cache( $transient_key, $results );

	return $results;
}