Obtener productos con atributo específico y en categoría - WooCommerce
Estoy tratando de obtener una lista/contador de productos que tienen un atributo y valor específico. Los productos se gestionan y configuran usando el plugin WooCommerce.
Cada producto tiene el mismo conjunto de variaciones, el producto está asignado a una categoría, necesito recuperar solo los productos con un atributo específico, por ejemplo "newyork" y la cantidad en stock que sea menor que, por ejemplo, "20".
Cada variación del producto está configurada con Stock Gestionado, pero no el producto en sí, espero que tenga sentido. Mi problema en este momento es que la consulta de WordPress que tengo no está verificando el nombre de la variación ni el stock en absoluto.
Cualquier ayuda sería apreciada.
<?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);

Deberías usar wc_get_products con un filtro personalizado para agregar tu consulta específica.
Ejemplo
Quiero encontrar productos que contengan un valor de atributo específico "table-filter".
$args = array(
'table-filter' => array(1,2,3)
);
$products = wc_get_products($args);
Luego tengo un filtro para esto:
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', //por defecto
'terms' => $query_vars['table-filter'],
'operator' => 'IN',
);
}
return $query;
}
Nota: La taxonomía de atributo generada por WooCommerce siempre tiene el prefijo "pa_", así que si tu slug de atributo es "table-filter", la taxonomía será "pa_table-filter".

Creo que tienes un problema con 'tax_query'. Si quieres usar un array en 'tax_query', necesitas seguir el formato de WordPress.
Una breve explicación para ti: en 'tax_query' necesitas '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'
)
