Filtro de WooCommerce: mostrar solo los atributos de la categoría actual
Cuando varias categorías de productos comparten un mismo atributo, un filtro de WooCommerce suele ofrecer valores que no tienen sentido en la página: Grill entre los frigoríficos, 512 GB entre los auriculares, marcas que no se venden en esa categoría. Al hacer clic en ellos, el resultado está vacío. Para que el filtro de WooCommerce muestre solo los atributos de la categoría actual, HUSKY cuenta los productos que hay detrás de cada término de la página y oculta los términos cuyo recuento es cero. A continuación se explica cómo funciona, los ajustes exactos, cómo mantener los números invisibles y los casos en los que la categoría no se conoce en absoluto.
Cómo sabe el filtro qué pertenece a la categoría actual
En una página de categoría de productos, y en cualquier otro archivo de taxonomía de producto (una etiqueta, un archivo de atributo, una marca), HUSKY recuerda el término que muestra la página. Con Recuento dinámico (Dynamic recount) activado, el número junto a cada término del filtro se calcula así: productos de esta categoría que cumplen todo lo que el visitante ya ha seleccionado y que además tienen este término. Un valor que no tiene ningún producto en la categoría obtiene 0.
Ocultar términos vacíos (Hide empty terms) elimina entonces del formulario todos los términos con 0. Cuando se eliminan todos los términos de una sección, también desaparece la sección entera, título incluido, de modo que un atributo que no se usa en la categoría desaparece de la barra lateral. La propia sección de categorías se reduce a las subcategorías de la categoría que se está viendo; por qué el filtro muestra solo subcategorías explica esa parte y sus excepciones.
No hay que configurar nada por categoría. El mismo formulario colocado en una barra lateral o en la plantilla de categoría se adapta por sí solo a cada página de categoría.
Los tres ajustes que ocultan los términos vacíos
Abre los ajustes del plugin, pestaña Opciones (Options), y configura:
- Mostrar recuento (Show count): Sí
- Recuento dinámico (Dynamic recount): Sí
- Ocultar términos vacíos (Hide empty terms): Sí
Guarda y vacía después todas las cachés que puedan conservar recuentos antiguos: Número de recuento dinámico de caché para cada elemento en el filtro (Cache dynamic recount number for each item in filter) y Términos de la caché (Cache terms) en Avanzadas → Opciones (Advanced → Options) si las usas, y la caché de páginas de tu sitio.
Las tres opciones dependen unas de otras, y la página de ajustes lo hace cumplir: un término vacío solo se puede detectar contando. Al activar Ocultar términos vacíos (Hide empty terms) se activan también las otras dos, y al desactivar Mostrar recuento (Show count) se desactivan también las otras dos. Si pones Mostrar recuento (Show count) en No para librarte de los números, los términos vacíos vuelven a aparecer en todas las páginas. Las combinaciones posibles:
| Mostrar recuento / Recuento dinámico / Ocultar términos vacíos | Qué ven los visitantes |
|---|---|
| No / No / No | Todos los términos, sin números |
| Sí / No / No | Números de toda la tienda; los términos sin ningún producto aparecen atenuados |
| Sí / Sí / No | Números de la categoría y la selección actuales; los términos con cero siguen visibles pero atenuados y no se pueden seleccionar |
| Sí / Sí / Sí | Los términos con cero se ocultan; las secciones vacías desaparecen |
La tercera línea es la opción adecuada cuando prefieres mostrar los valores no disponibles como inactivos en lugar de eliminarlos. Hay algunos sitios más que pueden anular las opciones globales:
- En la versión gratuita, Ocultar términos vacíos (Hide empty terms) y Ocultar texto de recuento de términos (Hide terms count text) (más abajo) aparecen atenuados; forman parte de la versión premium.
- El widget del filtro de HUSKY tiene su propio campo Recuento dinámico (Dynamic recount) (Predeterminado (Default), No, Sí (Yes)). Si está en No, ese widget ignora el ajuste global. El shortcode [woof] tiene el mismo interruptor como
dynamic_recount=1odynamic_recount=0. - Cuando el modo Turbo está activado, la pestaña Opciones (Options) muestra copias separadas de estos tres ajustes para el modo Turbo. Vuelve a configurarlas después de activarlo.
- Una taxonomía mostrada como control deslizante de rango no se recuenta con las opciones globales. Abre sus opciones adicionales (el icono del engranaje junto a la taxonomía en la pestaña Estructura (Structure)) y pon Habilitar recuento dinámico (Enable dynamic recount) en Sí; los valores sin productos quedan entonces fuera de la escala del control deslizante.
La documentación de la pestaña Opciones describe los demás ajustes de la misma pantalla.
Ocultar los términos vacíos sin mostrar el recuento
El deseo más habitual es ocultar los términos vacíos sin imprimir números como (12). Deja las tres opciones activadas y ve a Avanzadas → Opciones (Advanced → Options): pon Ocultar texto de recuento de términos (Hide terms count text) en Sí. El plugin sigue calculando los recuentos, que necesita para saber qué está vacío, pero no los imprime. Para hacerlo solo en un formulario, añade hide_terms_count=1 a su shortcode, por ejemplo [woof hide_terms_count=1].
Ocultar el contador con CSS también funciona para casillas de verificación y botones de radio (.woof_checkbox_count, .woof_radio_count), pero no para los desplegables: ahí el número forma parte del texto de la opción y no tiene un elemento propio. El ajuste cubre todos los tipos de filtro.
Para cambiar el contador solo en algunas secciones, usa el hook woof_term_count_format. Recibe el formato, (%d) por defecto, y el slug de la taxonomía:
/*
* HUSKY: counter format per filter section.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woof_term_count_format', function ($format, $tax_slug) {
// no numbers at all in the Tags and Brand sections
if (in_array($tax_slug, array('product_tag', 'pa_brand'), true)) {
return '';
}
// "12" instead of "(12)" everywhere else
return '%d';
}, 10, 2);
Los términos vacíos siguen ocultos en esas secciones, porque ocultarlos depende del recuento calculado, no del texto impreso. Para mostrar números solo en el nivel más bajo de un árbol de categorías, oculta con CSS los contadores de los términos que tienen hijos (campo de CSS personalizado de tu tema):
.woof_childs_list_li > .woof_checkbox_label > .woof_checkbox_count {
display: none;
}
Un término seleccionado nunca muestra un número. Es intencionado: el recuento omite los términos que ya forman parte de la búsqueda.
Por qué desaparecen otros valores tras la primera selección
El recuento dinámico reduce el formulario con cada elección: después de seleccionar Brand: Bosch, solo quedan los colores que tienen los productos Bosch de esta categoría. Ese es el objetivo de la función. No se puede desactivar solo para una sección.
Otro caso distinto es cuando elegir un color oculta todos los demás colores. Eso viene de la lógica de la sección. Abre las opciones adicionales de la taxonomía (el icono del engranaje en la pestaña Estructura (Structure)) y mira Lógica de filtrado (Logic of filtering):
- OR (predeterminado): productos que tienen al menos uno de los valores seleccionados. Cada uno de los demás colores se cuenta por separado (dentro de las selecciones de las otras secciones), de modo que los colores que existen en la categoría permanecen.
- AND: productos que tienen todos los valores seleccionados a la vez. El recuento de cada uno de los demás colores pasa a ser "productos que son rojos y azules al mismo tiempo", normalmente 0, así que con Ocultar términos vacíos (Hide empty terms) desaparecen.
- NOT IN: excluye los productos con los valores seleccionados.
Para colores, tallas y la mayoría de los atributos en los que el visitante quiere "esto o aquello", OR es la lógica correcta. Reserva AND para las características que deben cumplirse todas, como "Wi-Fi y Bluetooth".
Para opciones que se reducen antes de cargar ningún producto (un buscador formado por desplegables dependientes), usa [woof ajax_redraw=1 autosubmit=1]: cada cambio vuelve a dibujar solo el formulario con las opciones recontadas, y el botón del filtro carga los productos. ajax_redraw no está pensado para el modo AJAX, así que mantén desactivada Intenta ajaxificar la tienda (Try to ajaxify the shop) para ese formulario.
Página de tienda, páginas personalizadas y constructores de páginas
La reducción automática necesita un archivo de taxonomía. En cualquier otro sitio no hay categoría actual:
- La página principal de la tienda muestra todo el catálogo, así que, hasta que el visitante selecciona algo, solo se ocultan los valores que no tienen ningún producto en la tienda. Es el comportamiento correcto.
- Una página de WordPress (una página de inicio, una landing page, una página creada con Elementor o Divi que lista una categoría) no es un archivo de categoría, aunque muestre solo los productos de esa categoría. El filtro no puede saberlo y lo lista todo.
En una página así, indica a ambos shortcodes de qué categoría trata la página. Usa el ID del término de Productos → Categorías (Products → Categories):
[woof taxonomies=product_cat:15]
[woof_products taxonomies=product_cat:15 per_page=12]
El atributo taxonomies de [woof] hace que los recuentos y la ocultación sigan esa categoría, y el mismo atributo en [woof_products] limita los productos mostrados. Varios ID de una misma taxonomía se separan con comas (product_cat:15,16, productos de cualquiera de las dos), varias taxonomías con un signo más (product_cat:15+pa_color:22). Solo funciona con las tres opciones anteriores activadas. La configuración completa de estas páginas está en el filtro de productos en una página personalizada o en la portada.
Si necesitas un conjunto distinto de secciones por categoría, y no valores distintos, consulta cómo mostrar filtros diferentes por categoría.
Si el filtro en un archivo de categoría real sigue comportándose como en la página de la tienda, puede que la plantilla de archivo del tema oculte la categoría actual al plugin; esto ocurre sobre todo con las plantillas basadas en bloques. En Avanzadas → Opciones (Advanced → Options) pon Comprobación adicional de la página de categoría (Additional check of the category page) en Sí.
Una opción más ligera sin recuento dinámico
Si solo necesitas ocultar los términos que no tienen productos en ninguna parte de la tienda (tallas antiguas, una marca que dejaste de vender), no necesitas el recuento dinámico. Este fragmento pide a WordPress que omita esos términos cuando HUSKY los carga:
/*
* HUSKY: do not list terms that have no published products at all.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woof_get_terms_args', function ($args) {
$args['hide_empty'] = true;
return $args;
});
No cuesta nada al cargar la página, pero no conoce la categoría actual ni la selección del visitante: una talla que existe solo en calzado sigue apareciendo en la categoría de camisas. Si Términos de la caché (Cache terms) está activada, vacía la caché de términos después de añadir el código. La FAQ cómo ocultar los términos vacíos muestra el mismo fragmento.
Cuánto cuesta el recuento dinámico en catálogos grandes
Cada término del formulario necesita su propia consulta de recuento en cada visualización de página, incluidos los ocultos, de modo que un formulario con 300 términos ejecuta unas 300 consultas de recuento. Con unos pocos miles de productos no se nota; con decenas de miles puede ralentizar todas las páginas de categoría. Antes de desactivar la función:
- activa Número de recuento dinámico de caché para cada elemento en el filtro (Cache dynamic recount number for each item in filter) en Avanzadas → Opciones (Advanced → Options);
- usa
dynamic_recount=0en los formularios en los que no haga falta reducir, por ejemplo un formulario de búsqueda en la cabecera; - considera el modo Turbo, que filtra y cuenta a partir de un archivo de datos preparado en lugar de consultas a la base de datos.
Los detalles están en cómo acelerar el filtrado de productos en catálogos grandes.
Lista de comprobación cuando siguen apareciendo opciones irrelevantes
- Mostrar recuento (Show count), Recuento dinámico (Dynamic recount) y Ocultar términos vacíos (Hide empty terms) están todos en Sí (o sus copias del modo Turbo, si el modo Turbo está activado).
- Los números se ocultan con Ocultar texto de recuento de términos (Hide terms count text), no poniendo Mostrar recuento (Show count) en No.
- El campo Recuento dinámico (Dynamic recount) del widget está en Predeterminado (Default) o en Sí (Yes); no hay
dynamic_recount=0en el shortcode. - Estás probando en un archivo de categoría real, o el shortcode tiene
taxonomies=en una página personalizada. - La caché de recuento, la caché de términos y la caché de páginas se vaciaron después del cambio.
- La Lógica de filtrado (Logic of filtering) del atributo es OR si otros valores deben permanecer tras una selección.
Si todo esto está en orden y una categoría sigue listando valores sin productos, abre un tema en el foro de soporte de HUSKY con un enlace a la página de la categoría y el valor que debería ocultarse.