WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Платформа для конвертации и монетизации трафика
функция не описана

Automattic\WooCommerce\Blocks\StoreApi\Utilities

ProductQueryFilters::get_attribute_counts() public WC 1.0

Get attribute counts for the current products.

{} Это метод класса: ProductQueryFilters{}

Хуков нет.

Возвращает

Массив. termId=>count pairs.

Использование

$ProductQueryFilters = new ProductQueryFilters();
$ProductQueryFilters->get_attribute_counts( $request, $attributes );
$request(\WP_REST_Request) (обязательный)
The request object.
$attributes(массив)
Attributes to count, either names or ids.
По умолчанию: []

Код ProductQueryFilters::get_attribute_counts() WC 4.7.1

<?php
public function get_attribute_counts( $request, $attributes = [] ) {
	global $wpdb;

	// Remove paging and sorting params from the request.
	$request->set_param( 'page', null );
	$request->set_param( 'per_page', null );
	$request->set_param( 'order', null );
	$request->set_param( 'orderby', null );

	// Grab the request from the WP Query object, and remove SQL_CALC_FOUND_ROWS and Limits so we get a list of all products.
	$product_query = new ProductQuery();

	add_filter( 'posts_clauses', array( $product_query, 'add_query_clauses' ), 10, 2 );
	add_filter( 'posts_pre_query', '__return_empty_array' );

	$query_args                   = $product_query->prepare_objects_query( $request );
	$query_args['no_found_rows']  = true;
	$query_args['posts_per_page'] = -1;
	$query                        = new \WP_Query();
	$result                       = $query->query( $query_args );
	$product_query_sql            = $query->request;

	remove_filter( 'posts_clauses', array( $product_query, 'add_query_clauses' ), 10 );
	remove_filter( 'posts_pre_query', '__return_empty_array' );

	if ( count( $attributes ) === count( array_filter( $attributes, 'is_numeric' ) ) ) {
		$attributes = array_map( 'wc_attribute_taxonomy_name_by_id', wp_parse_id_list( $attributes ) );
	}

	$attributes_to_count     = array_map( 'wc_sanitize_taxonomy_name', $attributes );
	$attributes_to_count_sql = 'AND term_taxonomy.taxonomy IN ("' . implode( '","', $attributes_to_count ) . '")';
	$attribute_count_sql     = "
		SELECT COUNT( DISTINCT posts.ID ) as term_count, terms.term_id as term_count_id
		FROM {$wpdb->posts} AS posts
		INNER JOIN {$wpdb->term_relationships} AS term_relationships ON posts.ID = term_relationships.object_id
		INNER JOIN {$wpdb->term_taxonomy} AS term_taxonomy USING( term_taxonomy_id )
		INNER JOIN {$wpdb->terms} AS terms USING( term_id )
		WHERE posts.ID IN ( {$product_query_sql} )
		{$attributes_to_count_sql}
		GROUP BY terms.term_id
	";

	$results = $wpdb->get_results( $attribute_count_sql ); // phpcs:ignore

	return array_map( 'absint', wp_list_pluck( $results, 'term_count', 'term_count_id' ) );
}