Aprende cuando usar has_term(), is_tax() y funciones auxiliares para comprobaciones de taxonomías padre e hijo en WordPress.
ES

Comprobar si una entrada pertenece a un termino de taxonomía

5.00 /5 - (24 votes )
Última verificación: 1 de mayo de 2026
6min de lectura
Tutorial
Desarrollador full-stack

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)

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.

  1. Usa is_tax() solo para comprobar si estas en una página de archivo.
  2. Usa has_term() para comprobar logicamente entradas individuales.
  3. Recuerda que has_term no 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.

Siguiente paso

Transforma el artículo en una implementación real

Este bloque refuerza el enlazado interno y lleva al lector al siguiente paso más útil dentro de la arquitectura del sitio.

¿Quieres implementar esto en tu sitio?

Si quieres transformar el artículo en mejoras concretas, rediseño o un plan de implementación, puedo cerrar el alcance y ejecutar.

Cluster relacionado

Explora otros servicios WordPress y base de conocimiento

Refuerza tu negocio con soporte técnico profesional en áreas clave del ecosistema WordPress.

FAQ del artículo

Preguntas Frecuentes

Respuestas prácticas para aplicar el tema en la ejecución real.

SEO-ready GEO-ready AEO-ready 3 Q&A
Cual es la diferencia entre has_term() e is_tax()?
has_term() comprueba si una entrada específica esta asignada a un termino, mientras que is_tax() comprueba el contexto de la página de archivo actual. Resuelven problemas diferentes y no deben usarse indistintamente.
Como incluyo terminos hijos en mi comprobacion?
Generalmente necesitas un helper que expanda el termino padre con get_term_children() y luego compruebe la entrada contra ese arbol completo de terminos.
Debo usar IDs o slugs para condicionales de taxonomía?
Los IDs suelen ser un poco más eficientes y menos fragiles, especialmente en proyectos grandes o donde los slugs pueden cambiar durante la localización.

¿Necesitas un FAQ adaptado a tu sector y mercado? Preparamos una versión alineada con tus objetivos de negocio.

Hablemos

Artículos Relacionados

La función get_post_meta() es fundamental. Aprenda a obtener, mostrar y gestionar datos de campos personalizados en su tema. Guia avanzada para desarrolladores.
development

Como mostrar valores de campos personalizados en WordPress (guía 2026)

La función get_post_meta() es fundamental. Aprenda a obtener, mostrar y gestionar datos de campos personalizados en su tema. Guia avanzada para desarrolladores.

Deja de escribir sentencias if desordenadas. Aprende la diferencia entre in_category y has_term, como manejar categorías hijas recursivas eficientemente y optimizar tus etiquetas condicionales.
development

Lógica condicional de WordPress para taxonomías

Deja de escribir sentencias if desordenadas. Aprende la diferencia entre in_category y has_term, como manejar categorías hijas recursivas eficientemente y optimizar tus etiquetas condicionales.

Notas prácticas sobre WP_Query: cuándo get_posts gana a new WP_Query, por qué meta_query sobre claves no indexadas colapsa a escala, y cómo paginar loops personalizados sin caer en 404.
development

Una guía práctica de WP_Query y el Loop (edición de rendimiento 2026)

Notas prácticas sobre WP_Query: cuándo get_posts gana a new WP_Query, por qué meta_query sobre claves no indexadas colapsa a escala, y cómo paginar loops personalizados sin caer en 404.