Automattic\WooCommerce\Blocks\BlockTypes

ProductFilterTaxonomy::get_taxonomy_term_countsprivateWC 1.0

Retrieve the taxonomy term counts for current block.

Method of the class: ProductFilterTaxonomy{}

No Hooks.

Returns

Array. Term counts with term_id as key and count as value.

Usage

// private - for code of main (parent) class only
$result = $this->get_taxonomy_term_counts( $block, $taxonomy );
$block(WP_Block) (required)
Block instance.
$taxonomy(string) (required)
Taxonomy slug.

ProductFilterTaxonomy::get_taxonomy_term_counts() code WC 10.3.6

private function get_taxonomy_term_counts( $block, $taxonomy ) {
	if ( ! isset( $block->context['filterParams'] ) ) {
		return array();
	}

	$query_vars = ProductCollectionUtils::get_query_vars( $block, 1 );

	// Remove current taxonomy from query vars to avoid circular counting.
	$container       = wc_get_container();
	$params_handler  = $container->get( \Automattic\WooCommerce\Internal\ProductFilters\Params::class );
	$taxonomy_params = $params_handler->get_param( 'taxonomy' );

	if ( isset( $taxonomy_params[ $taxonomy ] ) ) {
		$param_key = $taxonomy_params[ $taxonomy ];
		unset( $query_vars[ $param_key ] );
	}

	/**
	 * Prevent circular counting when calculating filter counts with active attribute filters.
	 * Removes product attribute taxonomy filters to ensure accurate cross-filter counting.
	 *
	 * @see https://github.com/woocommerce/woocommerce/pull/52759
	 */
	if ( isset( $query_vars['taxonomy'] ) && false !== strpos( $query_vars['taxonomy'], 'pa_' ) ) {
		unset(
			$query_vars['taxonomy'],
			$query_vars['term']
		);
	}

	// Remove from tax_query if present.
	if ( ! empty( $query_vars['tax_query'] ) ) {
		// phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query
		$query_vars['tax_query'] = ProductCollectionUtils::remove_query_array( $query_vars['tax_query'], 'taxonomy', $taxonomy );
	}

	$counts = $container->get( FilterDataProvider::class )->with( $container->get( QueryClauses::class ) )->get_taxonomy_counts( $query_vars, $taxonomy );

	return $counts;
}