WP_Query: Excluir productos ocultos de la lista de productos en WooCommerce
Espero que esto no sea demasiado específico para WooCommerce.
Tengo un práctico shortcode que muestra una lista de todos mis productos con SKUs. Sin embargo, también incluye productos que he publicado pero que he configurado con visibilidad de catálogo como "oculto".
No puedo encontrar un argumento/parámetro para excluir productos ocultos (o solo incluir aquellos marcados como Catálogo/Búsqueda).
Sé que debe ser simple; simplemente no lo he encontrado. Gracias por cualquier ayuda.
Aquí está el código:
<?php
$params = array('posts_per_page' => -1, 'post_type' => 'product', 'orderby' => 'menu-order', 'order' => 'asc');
$wc_query = new WP_Query($params);
?>
<table class="product-list tablesorter"><thead><tr><th>SKU</th><th>Nombre del Producto</th></tr></thead><tbody>
<?php if ($wc_query->have_posts()) : ?>
<?php while ($wc_query->have_posts()) :
$wc_query->the_post(); ?>
<tr>
<td><?php global $product; echo $product->get_sku(); ?></td>
<td><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></td>
</tr>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<tr><td>
<?php _e( 'No Products' ); ?>
</td> </tr>
<?php endif; ?>
</tbody>
</table>

A partir de Woocommerce 3, la visibilidad cambió a taxonomía en lugar de meta. Por lo tanto, necesitas cambiar el meta_query a tax_query. Para mostrar solo productos visibles,
'tax_query' => array(
array(
'taxonomy' => 'product_visibility',
'field' => 'name',
'terms' => 'exclude-from-catalog',
'operator' => 'NOT IN',
),
),
y ejemplos para Productos Destacados
'tax_query' => array(
array(
'taxonomy' => 'product_visibility',
'field' => 'name',
'terms' => 'featured',
),
),
Términos posibles: 'exclude-from-search', 'exclude-from-catalog', 'featured', 'outofstock'.

Importante: Lo siguiente solo funciona para versiones de WooCommerce menores a 3.0. Para una respuesta más actualizada, por favor revisa la otra respuesta de kalle.
WooCommerce guarda estos datos como metadata
por lo que necesitarás ejecutar una Meta Query contra el nombre _visibility
. Algo como:
'meta_query' => array(
array(
'key' => '_visibility',
'value' => 'hidden',
'compare' => '!=',
)
)
Esto traerá todos los posts que no tengan el meta _visibility
igual a hidden
.

Perfecto. Eso es exactamente lo que necesitaba. Para cualquiera que busque esta respuesta, aquí está la consulta completa mencionada anteriormente.
<?php
$params = array('posts_per_page' => -1, 'post_type' => 'product', 'orderby' => 'menu-order', 'order' => 'asc', 'meta_query' => array(
array(
'key' => '_visibility',
'value' => 'hidden',
'compare' => '!=',
)
));
$wc_query = new WP_Query($params);
?>

@PeterIngersoll Por cierto, puedes marcar esta respuesta como aceptada para mostrar a los visitantes futuros qué solución te funcionó :) Hay una marca de verificación a la izquierda de la respuesta de Howdy. Lee más aquí: http://wordpress.stackexchange.com/help/someone-answers
