WOOT - WooCommerce Active Products Tables

Filtro de categorías en la tabla de productos WooCommerce: lógica y orden

El filtro de categorías de una tabla de productos WooCommerce convierte cada categoría que selecciona un visitante en una condición de una consulta de taxonomía de WordPress y une las categorías seleccionadas con la lógica que hayas definido para ese elemento del filtro. La mayoría de las sorpresas provienen de esa lógica, por ejemplo una subcategoría que sigue mostrando todos los productos de su categoría padre. A continuación se explica cómo construye el filtro su consulta, cómo configurarlo para categorías padre e hijas, cómo cambiar el orden de los términos en las listas desplegables y dos casos relacionados: el filtro En oferta (On Sale) y los filtros durante las importaciones de productos.

Cómo construye su consulta el filtro de categorías de una tabla de productos

Los filtros de taxonomía se añaden en la pestaña Filtro de una tabla. Cualquier taxonomía de producto puede ser un elemento del filtro: Categorías de producto (Product categories), Etiquetas de producto (Product tags), cada atributo global (pa_color, pa_size, etc.) y las taxonomías de producto personalizadas. Haz clic en el botón de engranaje de un elemento para abrir sus opciones (la ventana emergente se titula Table #12; filter field: product_cat). Aquí importan cuatro opciones:

OpciónQué hace
Selección múltiple (MultiSelect)Desactivada: una lista desplegable normal, un término cada vez. Activada: una selección múltiple, el visitante puede elegir varios términos.
Lógica (Logic)IN, AND o NOT IN: cómo se combinan los términos seleccionados de este elemento.
Excluir (Exclude)ID de términos separados por comas que se quitan de la lista desplegable.
Incluir (Include)ID de términos separados por comas: solo se muestran estos términos.

Cuando el visitante selecciona términos, el plugin añade una cláusula a la consulta de productos para ese elemento: los ID de los términos seleccionados con el operador de Lógica (Logic).

  • IN (el valor predeterminado, la lógica "OR"): productos que están en al menos uno de los términos seleccionados.
  • AND: productos que están en todos los términos seleccionados a la vez.
  • NOT IN: productos que no están en ninguno de los términos seleccionados. Útil para un filtro de tipo "excluir".

Los distintos elementos del filtro se combinan siempre con AND: una categoría, un color y un rango de precios deben cumplirse a la vez. Además, el filtro solo actúa dentro de los productos que la tabla ya muestra, así que las reglas de la pestaña Predefinición se aplican primero. La opción Lógica (Logic) pertenece a una tabla creada en WOOT → Tablas; una tabla generada a partir de atributos del shortcode sin ID de tabla usa siempre IN.

Categorías padre e hijas en el filtro de categorías

Las categorías de producto son jerárquicas y, en una consulta de taxonomía, WordPress trata por defecto una categoría como "esta categoría y todas sus subcategorías", que es también como la consulta el filtro. Esto explica la queja típica: un visitante selecciona Face y después Acne en una selección múltiple, y la tabla sigue mostrando todo lo de Face. Con IN, la categoría padre por sí sola ya coincide con todos los productos de todas sus subcategorías, así que añadir una subcategoría no puede restringir nada.

Cambiar Lógica (Logic) a AND rara vez es la solución para las categorías. WordPress expande cada categoría seleccionada con todas sus subcategorías y luego exige que un producto esté en todas ellas. Seleccionar una categoría padre con AND equivale, por tanto, a pedir productos asignados al padre y a cada una de sus subcategorías, que normalmente no existen. Dos subcategorías con AND muestran solo los productos asignados a ambas. Hay una única lógica por elemento del filtro; no puedes usar IN para algunos términos de una taxonomía y AND para otros.

Lo que funciona en la práctica:

  • Una sola lista desplegable. Deja Selección múltiple (MultiSelect) desactivada. El visitante elige exactamente una categoría, y elegir Acne sustituye a Face, de modo que la tabla muestra solo Acne (y las categorías que haya por debajo).
  • Una selección múltiple con IN, para categorías del mismo nivel. Al seleccionar Acne y Dry skin se muestran los productos de cualquiera de las dos. Solo falla cuando también se selecciona un padre.
  • Una lista más corta con Excluir o Incluir. La lista desplegable se construye como un árbol desde el nivel superior hacia abajo, y una subcategoría solo aparece si su padre aparece. Excluir un padre elimina toda su rama, e Incluir (Include) debe contener también los ID de los padres; de lo contrario, sus subcategorías nunca aparecen. El ID de un término se encuentra en Productos → Categorías (o Productos → Atributos → Configurar términos): pasa el cursor sobre el término y lee tag_ID= en el enlace de edición.
  • Una tabla distinta para cada sección de la tienda. Si una página trata de una categoría padre, limita su tabla a esa categoría en Predefinición y filtra solo sus subcategorías. Consulta tablas distintas para categorías distintas.

Los atributos y las etiquetas no son jerárquicos, así que AND funciona como se espera: Color con AND y los términos Red y Blue muestra los productos que tienen ambos. Un producto variable "tiene" todos los términos de atributo que figuran en sus atributos, independientemente de qué variación esté en stock.

Orden de los términos en las listas desplegables del filtro

Las listas desplegables muestran los términos de cada nivel por orden alfabético de nombre, con las subcategorías bajo su padre y marcadas con un guion por nivel. Los términos sin productos publicados no aparecen. El orden que definas en WooCommerce, arrastrando categorías en Productos → Categorías o con Orden de clasificación predeterminado (Default sort order) → Ordenación personalizada (Custom ordering) de un atributo, no se usa, y Incluir (Include) tampoco cambia el orden: solo decide qué términos aparecen.

Para mostrar las categorías y los atributos en el orden de WooCommerce, añade este código. Cambia solo las consultas que construyen el filtro de la tabla, no otras listas de términos del sitio.

/*
 * WOOT table filter: list product categories and attribute terms in the
 * order set in WooCommerce instead of alphabetically.
 * Child theme functions.php or a code snippets plugin.
 */
add_filter('woot_profile_extend', function ($profile) {
    foreach ($profile as $key => $field) {
        if (!is_array($field) || empty($field['get_filter_draw_data']) || !taxonomy_exists($key)) {
            continue;
        }
        if ('product_cat' !== $key && !taxonomy_is_product_attribute($key)) {
            continue;
        }

        $draw = $field['get_filter_draw_data'];

        $profile[$key]['get_filter_draw_data'] = function ($table_id) use ($draw) {
            $shop_order = function ($query) {
                $taxonomy = current((array) $query->query_vars['taxonomy']);
                $query->query_vars['orderby'] = taxonomy_is_product_attribute($taxonomy) ? wc_attribute_orderby($taxonomy) : 'menu_order';
            };

            add_action('pre_get_terms', $shop_order, 5);
            $data = $draw($table_id);
            remove_action('pre_get_terms', $shop_order, 5);

            return $data;
        };
    }

    return $profile;
});

En los atributos, el código sigue el Orden de clasificación predeterminado (Default sort order) de cada atributo (Ordenación personalizada (Custom ordering), Nombre (Name), Nombre (numérico) (Name (numeric)) o ID del término (Term ID)); las categorías siguen el orden en que las hayas arrastrado. Usa woot_profile_extend, el hook que expone los campos de la tabla. La lista de términos se escribe en la página cuando esta se genera, así que vacía la caché de la página después de añadir el código.

El filtro En oferta y los productos variables

El elemento de filtro En oferta (On Sale) es un interruptor. Cuando está activado, la tabla muestra solo los productos de la lista propia de WooCommerce de productos en oferta. Esa lista contiene todos los productos con un precio de oferta activo y el padre de cada variación con un precio de oferta activo, de modo que un producto variable aparece en cuanto al menos una de sus variaciones está en oferta.

WooCommerce guarda esta lista en una caché (el transient wc_products_onsale) y la actualiza cuando se guarda un producto y cuando empieza o termina una oferta programada. Si los precios de oferta se escribieron directamente en la base de datos, por ejemplo mediante una importación que se salta WooCommerce, el filtro puede no encontrar esos productos. Vacía la caché en WooCommerce → Estado → Herramientas → Transients de WooCommerce → Borrar transients.

Filtros durante las importaciones de productos

Todo lo del filtro se lee de la base de datos: los términos de las listas desplegables (solo los términos que tienen productos) y los límites de los controles deslizantes de rango. Mientras se ejecuta una importación (WP All Import u otra), los productos, los términos y sus recuentos cambian, por lo que las listas desplegables pueden omitir términos y los límites de los controles deslizantes pueden ser incorrectos. No es un error del filtro y termina con la importación. Dos puntos prácticos:

  • Ejecuta las importaciones grandes cuando haya poco tráfico, o en una copia de pruebas.
  • La lista de términos del filtro forma parte del HTML de la página. Si usas una caché de página, vacíala después de la importación; de lo contrario, los visitantes seguirán viendo la lista del momento en que se almacenó la página en caché.

Si el filtro sigue mostrando productos incorrectos

  • Abre las opciones de engranaje del elemento y revisa Lógica (Logic): IN para "cualquiera de", AND para "todos los de", NOT IN para "ninguno de".
  • En las categorías, prueba con una subcategoría seleccionada y sin padre: si así el resultado es correcto, la causa era el padre incluido en la selección.
  • Revisa el propio producto: un producto asignado directamente a la categoría padre coincide con el padre, no con una subcategoría.
  • Recuerda las reglas de Predefinición: el filtro nunca muestra productos que la tabla excluye.
  • Después de cambiar los términos o el código de orden, vacía la caché de la página y vuelve a cargarla sin haber iniciado sesión.

Si el resultado sigue sin coincidir con las categorías de tus productos, abre un tema en el foro de soporte de WOOT con el shortcode de la tabla, los ajustes del filtro y un producto de ejemplo, y lo revisaremos.