Una tarea comun para un desarrollador es mostrar un elemento (p. ej., un banner publicitario) solo si la entrada pertenece a una categoría o taxonomía específica (p. ej., ‘Genero de pelicula: Comedia’).
En WordPress, tenemos dos funciones principales para esto que a menudo se confunden: is_tax() y has_term(). La diferencia entre ellas es crucial para la lógica de tu tema.
Si quieres la versión corta primero, usa is_tax() para comprobar la página de archivo actual, y usa has_term() para comprobar si una entrada específica esta asignada a un termino.
1. is_tax() vs has_term() - Cual es la diferencia?
is_tax() - Contexto de página (archivo)
Usa esto para comprobar que página esta viendo el usuario.
- Esta el usuario actualmente en la página de archivo de la categoría “Terror”?
if ( is_tax( 'genre', 'horror' ) ) {
echo 'Estas en la lista de Terror!';
}
Esta función devolvera false si estas en una página de entrada individual, incluso si esa entrada es realmente una pelicula de terror.
has_term() - Contexto de entrada (individual)
Usa esto para comprobar que esta asignado a una entrada específica.
- Es esta pelicula específica de “Terror”?
if ( has_term( 'horror', 'genre' ) ) {
echo 'Esta entrada es una pelicula de terror.';
}
Esta función se usa más frecuentemente dentro del Loop o en el archivo single.php.
2. El problema de la jerarquía (padres e hijos)
El mayor desafio es que has_term() solo comprueba exactamente el termino que específicas.
Asume esta estructura:
- Peliculas (Taxonomía:
movie_genre)- Comedia (ID: 10)
- Romantica (ID: 11)
- Comedia Negra (ID: 12)
- Comedia (ID: 10)
Si tienes una entrada asignada SOLO a “Romantica”, al comprobar:
has_term( 'comedy', 'movie_genre' )
devolvera FALSE. Por que? Porque la entrada técnicamente no tiene la casilla “Comedia” marcada, solo “Romantica”.
Solución: Función auxiliar para descendientes
Para comprobar si una entrada pertenece a “Comedia” O cualquiera de sus subcategorias, necesitamos escribir nuestra propia función auxiliar.
/**
* Comprueba si una entrada pertenece a un termino o sus hijos.
*
* @param int|string|array $term_id_or_slug ID o Slug del termino padre.
* @param string $taxonomy Nombre de la taxonomia.
* @param int|null $post_id ID de la entrada (opcional).
* @return bool
*/
function wppoland_in_term_tree( $term_id_or_slug, $taxonomy, $post_id = null ) {
$post_id = $post_id ? $post_id : get_the_ID();
$term = get_term_by( is_numeric($term_id_or_slug) ? 'id' : 'slug', $term_id_or_slug, $taxonomy );
if ( ! $term ) {
return false;
}
// 1. Comprobar asignacion directa (más rápido)
if ( has_term( $term->term_id, $taxonomy, $post_id ) ) {
return true;
}
// 2. Obtener todos los hijos del termino
$children = get_term_children( $term->term_id, $taxonomy );
if ( is_wp_error( $children ) || empty( $children ) ) {
return false;
}
// 3. Comprobar si la entrada tiene alguno de los hijos
return has_term( $children, $taxonomy, $post_id );
}
Uso:
// En single.php
if ( wppoland_in_term_tree( 'comedy', 'movie_genre' ) ) {
get_template_part( 'partials/banner-comedy' );
}
Ahora esto funciona tanto para “Comedia” como para “Comedia Romantica”.
3. Optimización del rendimiento
La función get_term_children() realiza una consulta a la base de datos. Si usas esto en un bucle que muestra 50 entradas, estas haciendo 50 consultas SQL extra.
Como optimizar? Si tu estructura de categorías rara vez cambia, puedes almacenar en cache los IDs de los hijos en la API de Transients. Para la mayoria de los proyectos pequeños esto es opcional, pero se vuelve más útil cuando el mismo helper se ejecuta repetidamente en plantillas o bucles grandes.
Una optimización más importante es pasar el ID en lugar del Slug. WordPress tiene que buscar el ID a partir del Slug de todas formas, así que proporcionar el ID (p. ej., 10) ahorra una consulta de búsqueda.
// Mas rápido (ID)
has_term( 10, 'movie_genre' );
// Mas lento (Slug -> requiere búsqueda)
has_term( 'comedy', 'movie_genre' );
4. Patrones avanzados para WooCommerce
WooCommerce introduce sus propias taxonomías y funciones condicionales que merecen atención especial:
// Comprobar categoria de producto dentro de un bucle personalizado
$products = new WP_Query([
'post_type' => 'product',
'posts_per_page' => 12
]);
while ( $products->have_posts() ) : $products->the_post();
// INCORRECTO: is_product_category('electronics')
// CORRECTO: has_term('electronics', 'product_cat', get_the_ID())
if ( has_term( 'electronics', 'product_cat', get_the_ID() ) ) {
echo '<span class="badge">Electronica</span>';
}
endwhile;
wp_reset_postdata();
Taxonomías personalizadas de WooCommerce
// Atributos de producto son taxonomias con prefijo 'pa_'
if ( has_term( 'blue', 'pa_color', $product_id ) ) {
// El producto tiene el color azul
}
// Verificar marca personalizada
if ( has_term( 'samsung', 'product_brand', $product_id ) ) {
// Es un producto Samsung
}
5. Carga condicional de assets
Uno de los usos más practicos de los condicionales de taxonomía es la carga inteligente de scripts y estilos:
add_action( 'wp_enqueue_scripts', function() {
// Solo cargar el mapa en entradas con la categoria 'ubicaciones'
if ( is_singular() && has_term( 'ubicaciones', 'category' ) ) {
wp_enqueue_script( 'google-maps', 'https://maps.googleapis.com/maps/api/js', [], null, true );
wp_enqueue_script( 'custom-map', get_template_directory_uri() . '/js/map.js', ['google-maps'], '1.0', true );
}
// Solo cargar estilos de galeria en entradas con la etiqueta 'galeria'
if ( is_singular() && has_term( 'galeria', 'post_tag' ) ) {
wp_enqueue_style( 'lightbox', get_template_directory_uri() . '/css/lightbox.css' );
}
});
6. Integración con Block Editor y FSE
En el contexto de Full Site Editing en 2026, los condicionales de taxonomía se usan frecuentemente en bloques dinámicos:
register_block_type( 'wppoland/conditional-content', [
'render_callback' => function( $attributes, $content ) {
$taxonomy = $attributes['taxonomy'] ?? 'category';
$term = $attributes['term'] ?? '';
if ( ! empty( $term ) && has_term( $term, $taxonomy ) ) {
return $content;
}
return '';
},
]);
7. Cache de resultados con Object Cache
Para sitios de alto tráfico, almacena en cache los resultados:
function wppoland_cached_term_check( $term, $taxonomy, $post_id = null ) {
$post_id = $post_id ?: get_the_ID();
$cache_key = "term_check_{$term}_{$taxonomy}_{$post_id}";
$result = wp_cache_get( $cache_key, 'term_checks' );
if ( false === $result ) {
$result = has_term( $term, $taxonomy, $post_id ) ? 1 : 0;
wp_cache_set( $cache_key, $result, 'term_checks', HOUR_IN_SECONDS );
}
return (bool) $result;
}
Resumen
Descubre más sobre desarrollo profesional WordPress en WPPoland.
- Usa
is_tax()solo para comprobar si estas en una página de archivo. - Usa
has_term()para comprobar logicamente entradas individuales. - Recuerda que
has_termno hereda - si necesitas lógica “categoría y sus hijos”, usa una función auxiliar personalizada.
Esta es la base para construir temas dinámicos que reaccionan al contexto del contenido.

