Automattic\WooCommerce\Internal\ProductFilters

FilterData::get_taxonomy_countspublicWC 1.0

Get taxonomy counts for the current products.

Method of the class: FilterData{}

Returns

Array. termId=>count pairs.

Usage

$FilterData = new FilterData();
$FilterData->get_taxonomy_counts( $query_vars, $taxonomy_to_count );
$query_vars(array) (required)
The WP_Query arguments.
$taxonomy_to_count(string) (required)
Taxonomy name.

FilterData::get_taxonomy_counts() code WC 10.3.3

public function get_taxonomy_counts( array $query_vars, string $taxonomy_to_count ) {
	/**
	 * Filter the data. @see get_filtered_price() for full documentation.
	 *
	 * @since 9.9.0
	 */
	$pre_filter_counts = apply_filters( 'woocommerce_pre_product_filter_data', null, 'taxonomy', $query_vars, array( 'taxonomy' => $taxonomy_to_count ) );

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

	$transient_key = $this->get_transient_key( $query_vars, 'taxonomy', array( 'taxonomy' => $taxonomy_to_count ) );
	$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;

		$taxonomy_escaped = esc_sql( wc_sanitize_taxonomy_name( $taxonomy_to_count ) );

		if ( is_taxonomy_hierarchical( $taxonomy_to_count ) ) {
			$results = $this->get_hierarchical_taxonomy_counts( $product_ids, $taxonomy_to_count );
		} else {
			$taxonomy_count_sql = "
				SELECT COUNT( DISTINCT term_relationships.object_id ) as term_count, term_taxonomy.term_taxonomy_id as term_count_id
				FROM {$wpdb->term_relationships} AS term_relationships
				INNER JOIN {$wpdb->term_taxonomy} AS term_taxonomy USING( term_taxonomy_id )
				WHERE term_relationships.object_id IN ( {$product_ids} )
				AND term_taxonomy.taxonomy = '{$taxonomy_escaped}'
				GROUP BY term_taxonomy.term_taxonomy_id
			";

			/**
			 * 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
			$base_results = $wpdb->get_results( $taxonomy_count_sql );
			$results      = array_map( 'absint', wp_list_pluck( $base_results, 'term_count', 'term_count_id' ) );
		}
	}

	/**
	 * Filter the results. @see get_filtered_price() for full documentation.
	 *
	 * @since 9.9.0
	 */
	$results = apply_filters( 'woocommerce_product_filter_data', $results, 'taxonomy', $query_vars, array( 'taxonomy' => $taxonomy_to_count ) );

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

	return $results;
}