Получаем список товаров, относящихся к категории

Предположим, что в WooCoommerce у нас есть категория "Машины" и мы хотим получить список всех товаров, ей принадлежащих.

Вариант 1

С помощью get_posts().

Скопировано
$cat_name = 'Машины';
$term = get_term_by( 'name', $cat_name, 'product_cat' );
$posts_ids = get_posts([
	'post_type' => 'product',
	'posts_per_page' => -1,
	'fields' => 'ids',
	'tax_query' => array(
		array(
			'taxonomy' => 'product_cat',
			'field'    => 'id',
			'terms'    => $term->term_id
		)
	)
]);
Показать код

Если надо получить список только товаров в наличии, то добавляем строки

'meta_key' => '_stock_status',
'meta_value' => 'instock'

Вариант 2

С помощью SQL запроса к БД.

Скопировано
$cat_name = 'Машины';
$term = get_term_by( 'name', $cat_name, 'product_cat' );
$term_id = $term->term_id;
global $wpdb;
$posts_ids = $wpdb->get_col( "SELECT 
	ID FROM $wpdb->posts p
	JOIN $wpdb->term_relationships tr ON (p.ID = tr.object_id)
	JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id)
	JOIN $wpdb->terms t ON (tt.term_id = t.term_id)
	WHERE p.post_type='product'
	AND p.post_status = 'publish'
	AND tt.taxonomy = 'product_cat'
	AND t.term_id = $term_id
");
Показать код

Если надо получить список только товаров в наличии, то добавляем строки

JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
AND pm.meta_key LIKE '_stock_status'
AND pm.meta_value LIKE 'instock'

В обоих случаях мы получаем не товары целиком, а только их ID. Это делается с той целью, чтобы не вызвать ошибку переполнения памяти, ведь мы получаем все товары, а их может быть очень много.