Automattic\WooCommerce\StoreApi\Utilities

ProductQueryFilters::get_product_by_metas()publicWC 1.0

Gets product by metas.

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

Хуков нет.

Возвращает

Массив. $results

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

$ProductQueryFilters = new ProductQueryFilters();
$ProductQueryFilters->get_product_by_metas( $metas );
$metas(массив)
Array of metas to query.
По умолчанию: array()

Список изменений

Since TBD

Код ProductQueryFilters::get_product_by_metas() WC 8.7.0

public function get_product_by_metas( $metas = array() ) {
	global $wpdb;

	if ( empty( $metas ) ) {
		return array();
	}

	$where   = array();
	$results = array();
	$params  = array();
	foreach ( $metas as $column => $value ) {
		if ( empty( $value ) ) {
			continue;
		}

		if ( 'stock_status' === $column ) {
			$stock_product_ids = array();
			foreach ( $value as $stock_status ) {
				$stock_product_ids[] = $wpdb->get_col(
					$wpdb->prepare(
						"SELECT DISTINCT product_id FROM {$wpdb->prefix}wc_product_meta_lookup WHERE stock_status = %s",
						$stock_status
					)
				);
			}

			$where[] = 'product_id IN (' . implode( ',', array_merge( ...$stock_product_ids ) ) . ')';
			continue;
		}

		if ( 'min_price' === $column ) {
			$where[]  = "{$column} >= %d";
			$params[] = intval( $value ) / 100;
			continue;
		}

		if ( 'max_price' === $column ) {
			$where[]  = "{$column} <= %d";
			$params[] = intval( $value ) / 100;
			continue;
		}

		if ( 'average_rating' === $column ) {
			$where_rating = array();
			foreach ( $value as $rating ) {
				$where_rating[] = sprintf( '(average_rating >= %f - 0.5 AND average_rating < %f + 0.5)', $rating, $rating );
			}
			$where[] = '(' . implode( ' OR ', $where_rating ) . ')';
			continue;
		}

		$where[]  = sprintf( "%1s = '%s'", $column, $value );
		$params[] = $value;
	}

	if ( ! empty( $where ) ) {
		$where_clause = implode( ' AND ', $where );
		$where_clause = sprintf( $where_clause, ...$params );

	// phpcs:disable WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder
		$results = $wpdb->get_col(
			$wpdb->prepare(
				"SELECT DISTINCT product_id FROM {$wpdb->prefix}wc_product_meta_lookup WHERE %1s",
				$where_clause
			)
		);
	}
	// phpcs:enable

	return $results;
}