La función estándar de WordPress the_category() es genial, pero tiene un defecto: siempre genera enlaces HTML (<a href="...">...</a>) a la página de archivo. Que pasa si estas construyendo un diseño personalizado (como una tarjeta de portfolio o un slider) donde la categoría debe ser texto plano, no un elemento clicable?
Descubre más sobre desarrollo profesional WordPress en WPPoland.
La solución es usar get_the_category(), que devuelve un array de objetos en lugar de HTML listo.
Código (fragmento)
Aqui tienes un fragmento listo para usar que puedes pegar en tu single.php o content.php:
<?php
// Obtener todas las categorias asignadas a la entrada actual
$categories = get_the_category();
if ( ! empty( $categories ) ) {
// Mostrar el nombre de la primera categoria encontrada
echo esc_html( $categories[0]->name );
}
?>
Mostrar una lista separada por comas
Si tu entrada tiene multiples categorías y quieres listarlas como texto separado por comas:
<?php
$categories = get_the_category();
$output = array();
if ( ! empty( $categories ) ) {
foreach ( $categories as $category ) {
// Anadir nombre al array
$output[] = esc_html( $category->name );
}
// Unir el array en una cadena con separador
echo implode( ', ', $output );
}
?>
Por que get_the_category()?
Esta función te da acceso al objeto completo de categoría. Además del nombre (->name), puedes extraer:
->slug(util para clases CSS, p. ej.,<span class="cat-<?php echo $cat->slug; ?>">)->term_id(ID de la categoría)->description(descripción de la categoría)->count(número de entradas en esta categoría)
Aplicación práctica
Un caso de uso comun es estilizar etiquetas en tarjetas de blog.
// Dentro del loop de WordPress
$cats = get_the_category();
$first_cat = !empty($cats) ? $cats[0] : null;
if ($first_cat) : ?>
<span class="badge badge-<?php echo esc_attr($first_cat->slug); ?>">
<?php echo esc_html($first_cat->name); ?>
</span>
<?php endif; ?>
De esta forma, si tienes una categoría “Noticias”, obtendras la clase .badge-noticias, que puedes colorear fácilmente en CSS. Este nivel de control es algo que the_category() simplemente no ofrece.
Uso avanzado: Categoría primaria con plugins SEO
Cuando una entrada tiene multiples categorías, es comun querer mostrar solo la “principal”:
function wppoland_get_primary_category_name() {
$post_id = get_the_ID();
// Intentar obtener categoria primaria de Yoast
if ( class_exists( 'WPSEO_Primary_Term' ) ) {
$primary = new WPSEO_Primary_Term( 'category', $post_id );
$term_id = $primary->get_primary_term();
if ( $term_id ) {
$term = get_term( $term_id );
if ( ! is_wp_error( $term ) ) {
return esc_html( $term->name );
}
}
}
// Intentar obtener de RankMath
$rankmath_primary = get_post_meta( $post_id, 'rank_math_primary_category', true );
if ( $rankmath_primary ) {
$term = get_term( $rankmath_primary );
if ( ! is_wp_error( $term ) ) {
return esc_html( $term->name );
}
}
// Fallback: primera categoria
$cats = get_the_category( $post_id );
return ! empty( $cats ) ? esc_html( $cats[0]->name ) : '';
}
Estilizacion de etiquetas de categoría
CSS para badges de categoría elegantes:
.badge {
display: inline-block;
padding: 0.25rem 0.75rem;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
border-radius: 9999px;
background: #e5e7eb;
color: #374151;
}
/* Colores por categoria */
.badge-noticias {
background: #dbeafe;
color: #1e40af;
}
.badge-tutorial {
background: #d1fae5;
color: #065f46;
}
.badge-opinion {
background: #fef3c7;
color: #92400e;
}
/* Hover sutil */
.badge:hover {
filter: brightness(0.95);
cursor: default;
}
Categorías en formatos de tarjeta de blog
Un ejemplo completo de tarjeta de blog con categoría como insignia:
<?php while ( have_posts() ) : the_post(); ?>
<article class="blog-card">
<?php if ( has_post_thumbnail() ) : ?>
<div class="card-image">
<?php the_post_thumbnail( 'medium_large' ); ?>
<?php
$cats = get_the_category();
if ( ! empty( $cats ) ) :
$primary_cat = $cats[0];
?>
<span class="card-badge badge-<?php echo esc_attr( $primary_cat->slug ); ?>">
<?php echo esc_html( $primary_cat->name ); ?>
</span>
<?php endif; ?>
</div>
<?php endif; ?>
<div class="card-content">
<h2 class="card-title">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
</h2>
<div class="card-meta">
<time datetime="<?php echo get_the_date('c'); ?>">
<?php echo get_the_date(); ?>
</time>
<?php
// Mostrar todas las categorias como texto
$all_cats = get_the_category();
$cat_names = array_map( function( $cat ) {
return esc_html( $cat->name );
}, $all_cats );
echo '<span class="categories">' . implode( ' / ', $cat_names ) . '</span>';
?>
</div>
<p class="card-excerpt"><?php echo wp_trim_words( get_the_excerpt(), 20 ); ?></p>
</div>
</article>
<?php endwhile; ?>
Para taxonomías personalizadas
El mismo principio se aplica a taxonomías personalizadas con get_the_terms():
$genres = get_the_terms( get_the_ID(), 'genre' );
if ( ! empty( $genres ) && ! is_wp_error( $genres ) ) {
$genre_names = array();
foreach ( $genres as $genre ) {
$genre_names[] = esc_html( $genre->name );
}
echo implode( ', ', $genre_names );
}
Función helper reutilizable
Crea una función helper que funcióne con cualquier taxonomía:
/**
* Obtener nombres de terminos como texto plano
*
* @param string $taxonomy Nombre de la taxonomia
* @param string $separator Separador entre nombres
* @param int|null $post_id ID de la entrada
* @return string Lista de nombres separados
*/
function wppoland_get_term_names( $taxonomy = 'category', $separator = ', ', $post_id = null ) {
$post_id = $post_id ?: get_the_ID();
if ( $taxonomy === 'category' ) {
$terms = get_the_category( $post_id );
} else {
$terms = get_the_terms( $post_id, $taxonomy );
}
if ( empty( $terms ) || is_wp_error( $terms ) ) {
return '';
}
$names = array_map( function( $term ) {
return esc_html( $term->name );
}, $terms );
return implode( $separator, $names );
}
// Uso:
echo wppoland_get_term_names( 'category' ); // "Noticias, WordPress"
echo wppoland_get_term_names( 'post_tag', ' | ' ); // "PHP | CSS | HTML"
echo wppoland_get_term_names( 'genre', ' / ', 123 ); // "Accion / Drama"
Resumen
get_the_category() es la herramienta correcta cuando necesitas nombres de categoría como texto plano sin enlaces. Los puntos clave son:
the_category()siempre genera enlaces HTML, no se puede evitarget_the_category()devuelve objetos con acceso completo a metadatos- Siempre escapa la salida con
esc_html()por seguridad - Usa
implode()para listas separadas elegantemente - El mismo patron funciona con taxonomías personalizadas via
get_the_terms() - Crea funciones helper reutilizables para mantener tu código DRY



