Получаем список товаров, относящихся к категории
Предположим, что в 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. Это делается с той целью, чтобы не вызвать ошибку переполнения памяти, ведь мы получаем все товары, а их может быть очень много.