Получение товаров с определенным атрибутом и в категории - woocommerce
Я пытаюсь получить список/количество товаров, которые имеют определенный атрибут и значение. Товары управляются и настраиваются с помощью плагина WooCommerce.
Каждый товар имеет один и тот же набор вариаций, товар назначен категории, мне нужно получить только товары с определенным атрибутом, например "newyork", и количеством на складе меньше, например, "20".
Каждая вариация товара настроена на управление запасами, но не сам товар, надеюсь, это понятно. Моя проблема в том, что текущий WordPress запрос вообще не проверяет название вариации или количество на складе.
Буду благодарен за любую помощь.
<?php
$args = array(
'post_type' => array('product', 'product_variation'),
'post_status' => 'publish',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_stock',
'value' => 20,
'compare' => '<'
)
),
'tax_query' => array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('cat1', 'cat2', 'cat3'),
'operator' => 'IN',
),
array(
'taxonomy' => 'pa_regions',
'field' => 'slug',
'terms' => 'newyork',
'operator' => 'IN'
),
)
);
$loop = new WP_Query($args);
$post_count = array();
while($loop->have_posts()) : $loop->the_post();
global $product; ?>
<pre style="background: #1c1c1b; color: #f7e700">
<?php $post_count[] = $product->ID ;?>
</pre>
<?php endwhile; ?>
$total = count($post_count);

Вам следует использовать wc_get_products с пользовательским фильтром для добавления вашего специфического запроса.
Пример
Я хочу найти товары, содержащие конкретное значение атрибута "table-filter".
$args = array(
'table-filter' => array(1,2,3)
);
$products = wc_get_products($args);
Затем у меня есть фильтр для этого:
add_filter('woocommerce_product_data_store_cpt_get_products_query', 'my_handle_custom_query_var', 10, 2);
function my_handle_custom_query_var($query, $query_vars) {
if (!empty($query_vars['table-filter'])) {
$query['tax_query'][] = array(
'taxonomy' => 'pa_table-filter',
'field' => 'term_id', //по умолчанию
'terms' => $query_vars['table-filter'],
'operator' => 'IN',
);
}
return $query;
}
Подсказка: Сгенерированная таксономия атрибута в WooCommerce всегда имеет префикс "pa_", поэтому если слаг вашего атрибута "table-filter", то таксономия будет "pa_table-filter".

Похоже, у вас проблема с 'tax_query'. Если вам нужен массив запроса для 'tax_query', необходимо следовать формату WordPress.
Краткое пояснение для вас: в 'tax_query' требуется указать 'relation':
'tax_query' => array(
'relation'=>'AND', // 'AND' 'OR' ...
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array('cat1', 'cat2', 'cat3'),
'operator' => 'IN',
),
array(
'taxonomy' => 'pa_regions',
'field' => 'slug',
'terms' => 'newyork',
'operator' => 'IN'
)
