Automattic\WooCommerce\Internal\ProductFilters

FilterData::get_stock_status_countspublicWC 1.0

Get stock status counts for the current products.

Method of the class: FilterData{}

Returns

Array. status=>count pairs.

Usage

$FilterData = new FilterData();
$FilterData->get_stock_status_counts( $query_vars, $statuses );
$query_vars(array) (required)
The WP_Query arguments.
$statuses(array) (required)
Array of stock status values to count.

FilterData::get_stock_status_counts() code WC 10.9.1

public function get_stock_status_counts( array $query_vars, array $statuses ) {
	/**
	 * Filter the data. @see get_filtered_price() for full documentation.
	 */
	$pre_filter_counts = apply_filters( 'woocommerce_pre_product_filter_data', null, 'stock', $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, 'stock' );
	$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;

		if ( get_option( 'woocommerce_product_lookup_table_is_generating' ) ) {
			// Optimization note: this serves as a fallback while wc_product_meta_lookup is being populated and is bypassed most of the time.
			$sql = "
				SELECT meta_value AS stock_status, COUNT( DISTINCT post_id ) AS status_count
				FROM {$wpdb->postmeta}
				WHERE post_id IN ( {$product_ids} ) AND meta_key = '_stock_status'
				GROUP BY meta_value
			";
		} else {
			// Optimization note: this is the main performance driver as the database processes fewer rows than when scanning the posts meta table.
			$sql = "
				SELECT stock_status, COUNT( DISTINCT product_id ) as status_count
				FROM {$wpdb->wc_product_meta_lookup}
				WHERE product_id IN ( {$product_ids} )
				GROUP BY stock_status
			";
		}

		$results = array_fill_keys( $statuses, 0 );
		foreach ( $wpdb->get_results( $sql ) as $row ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
			if ( isset( $results[ $row->stock_status ] ) ) {
				$results[ $row->stock_status ] = (int) $row->status_count;
			}
		}
	}

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

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

	return $results;
}