Explicación de las diferentes soluciones:
- Método Principal (pre_get_posts):
- Es la solución más limpia y eficiente
- Afecta a todas las consultas principales de categorías
- No interfiere con otros plugins o widgets
- Mejor rendimiento
- Método Alternativo (woocommerce_product_query_tax_query):
- Útil si el primer método no funciona con tu tema
- Más específico para WooCommerce
- Puede ser necesario en algunos casos particulares
- Solución para Widgets:
- Específica para widgets de productos
- Útil si necesitas mantener el comportamiento en el loop principal pero modificarlo en widgets
- Solución para Shortcodes:
- Modifica el comportamiento de los shortcodes de productos
- Útil para páginas personalizadas donde uses shortcodes
Para implementar:
- Elige el método que mejor se adapte a tus necesidades:
- Si solo necesitas la funcionalidad básica, usa el Método 1
- Si necesitas una solución completa, puedes usar todos los métodos
- Añade el código en:
- Functions.php de tu tema hijo (recomendado)
- Un plugin de snippets como "Code Snippets"
- Prueba en diferentes situaciones:
- Página de categoría principal
- Widgets de productos
- Shortcodes de productos
Consideraciones adicionales:
- Rendimiento:
- El código es ligero y no afecta significativamente al rendimiento
- Las consultas se optimizan al reducir los productos mostrados
- Compatibilidad:
- Compatible con la mayoría de los temas
- Funciona con WooCommerce 3.0+
- No interfiere con otros plugins
- Mantenimiento:
- Código fácil de modificar
- Comentarios explicativos incluidos
- Fácil de deshabilitar si es necesario
<?php
/**
* Evitar mostrar productos de subcategorías en categoría principal
*/
// Método 1: Usando pre_get_posts (recomendado)
function excluir_productos_subcategorias($query) {
if (!is_admin() && $query->is_main_query() && is_product_category()) {
$query->set('tax_query', array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => get_queried_object_id(),
'include_children' => false
)
));
}
}
add_action('pre_get_posts', 'excluir_productos_subcategorias');
// Método 2: Modificando los argumentos de WooCommerce (alternativa)
function modificar_args_loop_shop($args) {
if (is_product_category()) {
$args['tax_query'] = array(
array(
'taxonomy' => 'product_cat',
'field' => 'id',
'terms' => get_queried_object_id(),
'include_children' => false
)
);
}
return $args;
}
add_filter('woocommerce_product_query_tax_query', 'modificar_args_loop_shop');
// Método 3: Solución específica para widgets (opcional)
function modificar_args_widget_productos($args) {
if (isset($args['tax_query'])) {
foreach ($args['tax_query'] as $key => $value) {
if (isset($value['taxonomy']) && $value['taxonomy'] === 'product_cat') {
$args['tax_query'][$key]['include_children'] = false;
}
}
}
return $args;
}
add_filter('woocommerce_products_widget_query_args', 'modificar_args_widget_productos');
// Método 4: Solución para shortcodes de productos (opcional)
function modificar_args_shortcode_productos($args) {
if (isset($args['category'])) {
$args['tax_query'] = array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => explode(',', $args['category']),
'include_children' => false
)
);
unset($args['category']);
}
return $args;
}
add_filter('woocommerce_shortcode_products_query', 'modificar_args_shortcode_productos');