Hace poco un cliente me planteó una necesidad bastante concreta en una tienda WooCommerce. Dentro del catálogo existía una sección dedicada a una marca específica y algunos productos eran exclusivos de ella. Estos productos debían seguir siendo accesibles para los usuarios interesados en esa marca, pero no tenía sentido que aparecieran también mezclados con el resto del catálogo en la página principal de la tienda.
El problema era que WooCommerce los incluía de forma natural en el listado general de productos. A nivel técnico esto es perfectamente lógico, ya que pertenecían al catálogo igual que cualquier otro artículo. Sin embargo, desde el punto de vista de la organización de la tienda generaba cierta confusión, porque se trataba de una línea de productos que debía mantenerse separada del resto.
La pregunta que me trasladó el cliente fue sencilla: ¿podemos conseguir que estos productos sigan existiendo dentro de su sección correspondiente, pero que desaparezcan de la página principal de la tienda?
Aunque pueda parecer una opción relativamente habitual dentro de la configuración de WooCommerce, la realidad es que no existe ningún ajuste específico para hacerlo. En este caso era necesario modificar la consulta que utiliza WooCommerce para construir el listado principal de productos.
Además, había un matiz importante que condicionaba completamente la solución. El objetivo no era ocultar los productos ni impedir que los usuarios accedieran a ellos. De hecho, debían seguir siendo visibles dentro de la sección de la marca para la que habían sido creados. Lo único que necesitábamos era evitar que aparecieran mezclados con el catálogo general.
Excluir una categoría de la página principal de tienda
La forma más sencilla de conseguirlo consiste en actuar sobre la consulta que WooCommerce utiliza cuando genera la página principal de tienda. Mediante un pequeño filtro podemos excluir una categoría concreta y evitar que sus productos formen parte de ese listado.
Puedes añadir el siguiente código en el archivo functions.php de tu tema hijo o, preferiblemente, en un plugin de funcionalidades:
add_filter( 'woocommerce_product_query_tax_query', 'exclude_category_from_shop_page', 10, 2 );
function exclude_category_from_shop_page( $tax_query, $query ) {
if ( ! is_admin() && function_exists( 'is_shop' ) && is_shop() ) {
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'marca-exclusiva' ),
'operator' => 'NOT IN',
'include_children' => true,
);
}
return $tax_query;
}
En este ejemplo deberás sustituir marca-exclusiva por el slug de la categoría que quieras excluir.
Una vez aplicado, los productos de esa categoría dejarán de mostrarse en la página principal de tienda, pero seguirán siendo accesibles desde la propia categoría, desde sus URLs directas y desde cualquier otro enlace que apunte a ellos.
Por qué prefiero utilizar el ID de la categoría
Aunque la solución basada en el slug funciona perfectamente, en la práctica suelo preferir trabajar con IDs cuando se trata de personalizaciones de este tipo.
La razón es sencilla. Los slugs pueden cambiar con el tiempo por motivos de SEO, durante una migración o simplemente porque alguien decide renombrar una categoría desde el panel de administración. El ID, en cambio, permanece estable y evita que una modificación aparentemente inocente termine afectando al funcionamiento del código.
La misma solución utilizando el ID de la categoría quedaría así:
add_filter( 'woocommerce_product_query_tax_query', 'exclude_category_from_shop_page', 10, 2 );
function exclude_category_from_shop_page( $tax_query, $query ) {
if ( ! is_admin() && function_exists( 'is_shop' ) && is_shop() ) {
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => array( 123 ),
'operator' => 'NOT IN',
'include_children' => true,
);
}
return $tax_query;
}
Solo tendrás que sustituir 123 por el ID real de la categoría en cuestión.
Cómo localizar el ID de una categoría
Si no conoces el ID de la categoría, puedes obtenerlo fácilmente desde el administrador de WordPress.
Accede a Productos >> Categorías y edita la categoría que quieras excluir. En la URL del navegador encontrarás algo parecido a esto:
wp-admin/term.php?taxonomy=product_cat&tag_ID=123
El valor de tag_ID corresponde al identificador de la categoría.
Qué ocurre si utilizas WPML
En la tienda en la que tuve que implementar esta solución existía además un detalle adicional: era una instalación multidioma gestionada con WPML.
En este escenario hay que tener cuidado porque cada traducción de una categoría posee su propio ID. Si utilizamos directamente el identificador de la categoría del idioma principal, es posible que la exclusión deje de funcionar correctamente en otros idiomas.
Para evitarlo, podemos obtener automáticamente el ID correspondiente a la traducción activa mediante WPML.
add_filter( 'woocommerce_product_query_tax_query', 'exclude_category_from_main_shop', 10, 2 );
function exclude_category_from_main_shop( $tax_query, $query ) {
if ( is_admin() || ! function_exists( 'is_shop' ) || ! is_shop() ) {
return $tax_query;
}
$default_category_id = 123;
$current_category_id = $default_category_id;
if ( has_filter( 'wpml_object_id' ) ) {
$translated_category_id = apply_filters(
'wpml_object_id',
$default_category_id,
'product_cat',
true
);
if ( ! empty( $translated_category_id ) ) {
$current_category_id = (int) $translated_category_id;
}
}
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => array( $current_category_id ),
'operator' => 'NOT IN',
'include_children' => true,
);
return $tax_query;
}
De esta forma la exclusión seguirá funcionando independientemente del idioma desde el que se consulte la tienda.
Algunas limitaciones que conviene conocer
Esta solución modifica únicamente el listado principal de productos de la página de tienda. Dependiendo de cómo esté construida la web, esos productos podrían seguir apareciendo en otros lugares.
Por ejemplo, podrían seguir mostrándose en los resultados de búsqueda, en los productos relacionados, en bloques de productos destacados o en consultas personalizadas realizadas por el tema o por algún plugin.
También conviene tenerlo en cuenta si trabajas con el editor de bloques de WordPress o con constructores visuales que generen sus propios listados de productos, ya que en esos casos pueden existir consultas independientes de la que utiliza WooCommerce para la página principal de tienda.
Por tanto, si tu intención es ocultar completamente esos productos en toda la web, será necesario revisar cada uno de esos escenarios de forma independiente.






Deja una respuesta