Como mostrar navegación de migas de pan por categorías? Obtener categorías padre e hijo programaticamente. Código listo para usar.
ES

Como mostrar la categoría actual y padre de una entrada (fragmento WordPress)

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

Cuando construyes temas WordPress personalizados, a menudo necesitas mostrar no solo la categoría actual, sino también su categoría padre (para navegación de migas de pan o menús jerarquicos).

Descubre más sobre desarrollo profesional WordPress en WPPoland. WordPress almacena las categorías en una estructura jerarquica, pero get_the_category() devuelve un array plano. Aqui te mostramos como extraer la jerarquía.

#Método: get_the_category() + comprobacion de padre

Aqui tienes una función lista para pegar en functions.php:

function wppoland_get_category_hierarchy() {
    $categories = get_the_category();

    if ( empty( $categories ) ) {
        return false;
    }

    // Obtener la primera categoria
    $category = $categories[0];

    $output = '';

    // Si la categoria tiene padre
    if ( $category->parent ) {
        $parent = get_category( $category->parent );
        $output .= '<a href="' . esc_url( get_category_link( $parent->term_id ) ) . '">' . esc_html( $parent->name ) . '</a> &raquo; ';
    }

    // Categoria actual
    $output .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '">' . esc_html( $category->name ) . '</a>';

    return $output;
}

#Uso en la plantilla

<?php
$hierarchy = wppoland_get_category_hierarchy();
if ( $hierarchy ) {
    echo '<div class="category-breadcrumb">' . $hierarchy . '</div>';
}
?>

Esto mostrara algo como: Tecnologia >> WordPress

#Alternativa: Rastro completo de migas de pan

Si necesitas la jerarquía completa (abuelo, padre, hijo), usa este enfoque recursivo:

function wppoland_get_full_category_trail( $category_id ) {
    $trail = array();

    while ( $category_id ) {
        $category = get_category( $category_id );
        array_unshift( $trail, $category );
        $category_id = $category->parent;
    }

    $output = '';
    foreach ( $trail as $cat ) {
        $output .= '<a href="' . esc_url( get_category_link( $cat->term_id ) ) . '">' . esc_html( $cat->name ) . '</a> &raquo; ';
    }

    return rtrim( $output, ' &raquo; ' );
}

#Seleccion de la categoría primaria

Cuando una entrada tiene multiples categorías, necesitas determinar cual es la “primaria”. Varios plugins SEO ofrecen esta funcionalidad:

#Con Yoast SEO

function wppoland_get_primary_category() {
    $post_id = get_the_ID();

    // Comprobar si Yoast tiene una categoria primaria definida
    if ( class_exists( 'WPSEO_Primary_Term' ) ) {
        $primary_term = new WPSEO_Primary_Term( 'category', $post_id );
        $primary_cat_id = $primary_term->get_primary_term();

        if ( $primary_cat_id ) {
            return get_category( $primary_cat_id );
        }
    }

    // Fallback: primera categoria
    $categories = get_the_category( $post_id );
    return ! empty( $categories ) ? $categories[0] : null;
}

#Con RankMath

function wppoland_get_rankmath_primary_category() {
    $post_id = get_the_ID();

    // RankMath almacena la categoria primaria en post meta
    $primary_cat_id = get_post_meta( $post_id, 'rank_math_primary_category', true );

    if ( $primary_cat_id ) {
        return get_category( $primary_cat_id );
    }

    // Fallback
    $categories = get_the_category( $post_id );
    return ! empty( $categories ) ? $categories[0] : null;
}

#Implementación con Schema.org BreadcrumbList

Para SEO, es importante marcar las migas de pan con datos estructurados:

function wppoland_schema_breadcrumbs() {
    $categories = get_the_category();
    if ( empty( $categories ) ) return;

    $category = $categories[0];
    $trail = array();

    // Construir rastro de categorias
    $current = $category;
    while ( $current ) {
        array_unshift( $trail, $current );
        $current = $current->parent ? get_category( $current->parent ) : null;
    }

    // Generar JSON-LD
    $items = array();
    $position = 1;

    // Inicio
    $items[] = array(
        '@type' => 'ListItem',
        'position' => $position++,
        'name' => 'Inicio',
        'item' => home_url()
    );

    // Categorias
    foreach ( $trail as $cat ) {
        $items[] = array(
            '@type' => 'ListItem',
            'position' => $position++,
            'name' => $cat->name,
            'item' => get_category_link( $cat->term_id )
        );
    }

    // Entrada actual
    $items[] = array(
        '@type' => 'ListItem',
        'position' => $position,
        'name' => get_the_title(),
        'item' => get_permalink()
    );

    $schema = array(
        '@context' => 'https://schema.org',
        '@type' => 'BreadcrumbList',
        'itemListElement' => $items
    );

    echo '<script type="application/ld+json">' . wp_json_encode( $schema ) . '</script>';
}
add_action( 'wp_head', 'wppoland_schema_breadcrumbs' );

#Estilizacion CSS de las migas de pan

.category-breadcrumb {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.875rem;
    color: #6b7280;
    margin-bottom: 1rem;
}

.category-breadcrumb a {
    color: #3b82f6;
    text-decoration: none;
    transition: color 0.2s ease;
}

.category-breadcrumb a:hover {
    color: #1d4ed8;
    text-decoration: underline;
}

/* Separador personalizado */
.category-breadcrumb span.separator {
    color: #d1d5db;
    font-size: 0.75rem;
}

/* Responsivo */
@media (max-width: 640px) {
    .category-breadcrumb {
        font-size: 0.75rem;
        flex-wrap: wrap;
    }
}

#Migas de pan para taxonomías personalizadas

La misma lógica se aplica a taxonomías personalizadas. Solo necesitas reemplazar las funciones de categoría con las equivalentes de taxonomía:

function wppoland_get_custom_taxonomy_trail( $taxonomy, $post_id = null ) {
    $post_id = $post_id ?: get_the_ID();
    $terms = get_the_terms( $post_id, $taxonomy );

    if ( ! $terms || is_wp_error( $terms ) ) {
        return '';
    }

    // Tomar el primer termino
    $term = $terms[0];
    $trail = array();

    // Construir jerarquia
    $current = $term;
    while ( $current ) {
        array_unshift( $trail, $current );
        $current = $current->parent ? get_term( $current->parent, $taxonomy ) : null;
    }

    $output = '';
    foreach ( $trail as $t ) {
        $link = get_term_link( $t, $taxonomy );
        if ( ! is_wp_error( $link ) ) {
            $output .= '<a href="' . esc_url( $link ) . '">' . esc_html( $t->name ) . '</a> &raquo; ';
        }
    }

    return rtrim( $output, ' &raquo; ' );
}

#Rendimiento y cache

Para sitios con alto tráfico, considera almacenar en cache el resultado de las migas de pan:

function wppoland_cached_breadcrumbs() {
    $post_id = get_the_ID();
    $cache_key = 'breadcrumbs_' . $post_id;

    $output = get_transient( $cache_key );
    if ( false === $output ) {
        $output = wppoland_get_full_category_trail(
            get_the_category()[0]->term_id ?? 0
        );
        set_transient( $cache_key, $output, DAY_IN_SECONDS );
    }

    return $output;
}

// Invalidar cache cuando se actualiza la entrada
add_action( 'save_post', function( $post_id ) {
    delete_transient( 'breadcrumbs_' . $post_id );
});

#Integración con Block Editor

En temas de bloques, puedes crear un bloque personalizado para migas de pan de categorías:

register_block_type( 'wppoland/category-breadcrumbs', [
    'render_callback' => function() {
        $hierarchy = wppoland_get_category_hierarchy();
        if ( ! $hierarchy ) return '';

        return sprintf(
            '<nav class="wp-block-wppoland-breadcrumbs" aria-label="Migas de pan">%s</nav>',
            $hierarchy
        );
    },
]);

#Resumen

Esta solución es limpia, eficiente y maneja correctamente jerarquías de categorías de multiples niveles. Los puntos clave son:

  • Usa get_the_category() para obtener las categorías de la entrada
  • Recorre la propiedad parent para construir la jerarquía
  • Implementa Schema.org BreadcrumbList para SEO
  • Considera la cache para sitios de alto tráfico
  • Soporta tanto categorías nativas como taxonomías personalizadas
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
Como funciona la jerarquía de categorías en WordPress?
WordPress almacena las categorías en una estructura jerarquica usando la propiedad 'parent' en cada objeto de categoría. get_the_category() devuelve un array plano, así que necesitas recorrer los padres manualmente.
Puedo mostrar multiples niveles de categorías padre?
Si. Usa un bucle while que recorra los padres hasta llegar a una categoría sin padre (nivel superior), o usa la función integrada get_category_parents().
Cual es la mejor manera de mostrar migas de pan de categorías?
Para proyectos simples usa get_category_parents(). Para control total, implementa una función recursiva personalizada que recorra la jerarquía y genere HTML personalizado.

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

Hablemos

Artículos Relacionados

Necesitas obtener la URL de la primera imagen o enlace en un artículo? Usa Expresiones Regulares (Regex) o DOMDocument. Código para desarrolladores.
development

Como extraer el primer enlace del contenido de una entrada (fragmento PHP)

Necesitas obtener la URL de la primera imagen o enlace en un artículo? Usa Expresiones Regulares (Regex) o DOMDocument. Código 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.

Un snippet práctico de WordPress para agregar slugs de páginas padre y ancestros a body_class(), permitiendo apuntar a secciones del sitio con CSS más limpio.
wordpress

Agregar slugs de páginas padre a las clases body de WordPress

Un snippet práctico de WordPress para agregar slugs de páginas padre y ancestros a body_class(), permitiendo apuntar a secciones del sitio con CSS más limpio.