Mostrar productos de una categoría específica en la página de tienda
Sé que muchas personas han preguntado sobre esto pero no encontré una manera adecuada de hacerlo. ¿Cómo agregar una simple meta_query (product_cat) antes de la ejecución de la consulta de la página de tienda?
¿Tal vez usando un filtro?
Saludos,
Adrien

La página de tienda es en realidad una página de archivo para publicaciones del tipo 'product'. Su plantilla se encuentra en woocommerce/archive-product.php.
Necesitas usar la acción pre_get_posts para preprocesar la consulta antes del ciclo, conditional_tags para reconocer que estás en la página de archivo de productos, y una consulta de taxonomía para filtrar las categorías de productos, que pertenecen a la taxonomía 'product_cat'.
Por ejemplo, el siguiente código (colocado en el functions.php de tu tema o en un plugin) mostrará solo productos con la categoría 'type-1':
add_action('pre_get_posts','shop_filter_cat');
function shop_filter_cat($query) {
if (!is_admin() && is_post_type_archive( 'product' ) && $query->is_main_query()) {
$query->set('tax_query', array(
array ('taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'type-1'
)
)
);
}
}
También puedes excluir categorías usando 'operator' => 'NOT IN', y 'terms' puede ser un array de slugs de categorías de productos.
Una buena introducción a la personalización de consultas es http://www.billerickson.net/customize-the-wordpress-query/

Si deseas mostrar productos de una categoría específica en tu página de tienda, puedes insertar el siguiente código en el archivo function.php
de tu tema.
// Ejecutar antes de que comience el bucle
add_action( 'woocommerce_before_shop_loop', 'techlyse_before_action', 15 );
function techlyse_before_action() {
//Para asegurar que es la página de tienda
if ( is_shop() ) {
$query_args['tax_query'] = array(
array(
'taxonomy' => 'product_cat',
'field' => 'id', //Si deseas usar el slug de la categoría, pasa slug en lugar de id y el slug de la categoría en lugar de 1330.
'terms' => 1330
)
);
//print_r($query_args);
query_posts( $query_args );
}
}
// Ejecutar después de que termine el bucle
add_action( 'woocommerce_after_shop_loop', 'techlyse_after_action', 15 );
function techlyse_after_action() {
//Para asegurar que es la página de tienda
if ( is_shop() ) {
//Reiniciar la consulta después del bucle
wp_reset_query();
}
}
