Navegación de Migas de Pan para Taxonomías Personalizadas

12 jun 2014, 19:17:03
Vistas: 15K
Votos: 2

Soy completamente nuevo en los tipos de contenido personalizados y taxonomías personalizadas, así que tengan paciencia. Estoy tratando de crear una navegación de migas de pan para la taxonomía personalizada project-category dentro del tipo de contenido personalizado projects. Básicamente, necesito que funcione así:

Tipo de Contenido Personalizado > Nivel 1 de Taxonomía > Nivel 2 de Taxonomía > Nivel 3 de Taxonomía > etc.

Cada encabezado debe enlazarse a la página correspondiente. Tengo esto más o menos funcionando, pero no es muy dinámico y solo enlaza tres niveles de navegación. Aquí está mi código actual:

<ul>
    <li><a href="/projects">Projects</a></li>
    <?
    $term = get_term_by("slug", get_query_var("term"), get_query_var("taxonomy") );
    $parent = get_term($term->parent, get_query_var("taxonomy"));
    if ($parent->name != "") {
        echo "<li><a href=\"/project-category/" . $parent->slug . "\">" . $parent->name . "</a></li>";
    }
    if (is_tax("project-category")) {
        $term = get_term_by("slug", get_query_var("term"), get_query_var("taxonomy"));
        $tax_term_breadcrumb_taxonomy_slug = $term->taxonomy;
        echo "<li><a href=\"/project-category/" . $term->slug . "\">" . $term->name . "</a></li>";
    }
    ?>
</ul>

Hasta el segundo nivel, esto funciona actualmente, así:

Tipo de Contenido Personalizado > Nivel 1 de Taxonomía > Nivel 2 de Taxonomía

Pero si voy a un tercer nivel, termina siendo:

Tipo de Contenido Personalizado > Nivel 2 de Taxonomía > Nivel 3 de Taxonomía

Cuanto más profundo voy, más se desajustan los niveles. Sé que el problema es que solo estoy verificando un padre, pero no puedo descubrir cómo verificar todos los padres posibles.

ACTUALIZACIÓN: Logré que funcione un poco mejor, pero está listando las cosas al revés. Aquí está mi código actualizado:

<ul>
    <li><a href="<? echo home_url(); ?>/projects">Projects</a></li>
    <?
    $term = get_term_by("slug", get_query_var("term"), get_query_var("taxonomy") );
    $parent = get_term($term->parent, get_query_var("taxonomy"));
    while ($parent->term_id) {
        echo "<li><a href=\"" . home_url() . "/project-category/" . $parent->slug . "\">" . $parent->name . "</a></li>";
        $parent = get_term($parent->parent, get_query_var("taxonomy"));
    }
    echo "<li><a href=\"" . home_url() . "/project-category/" . $term->slug . "\">" . $term->name . "</a></li>";
    ?>
</ul>

En lugar de mostrar Tipo de Contenido Personalizado > Nivel 1 de Taxonomía > Nivel 2 de Taxonomía > Nivel 3 de Taxonomía, está mostrando Tipo de Contenido Personalizado > Nivel 2 de Taxonomía > Nivel 1 de Taxonomía > Nivel 3 de Taxonomía. Tiene que ver con el bucle while, pero no puedo revertirlo.

Gracias.

3
Comentarios

Vas a necesitar algún tipo de bucle que seguirá iterando hasta que alcance un punto de parada con $term->parent == 0 <--- ese es tu punto de parada, donde no hay más padres que obtener.

Howdy_McGee Howdy_McGee
12 jun 2014 19:40:10

En serio odio recomendar plugins como respuesta, pero estoy usando Hansel & Gretel: Fine-Tuned Breadcrumb Generator y me gusta mucho, desde que lo uso, no más dolores de cabeza con las migas de pan ;)

Jonathan Lafleur Jonathan Lafleur
12 jun 2014 20:16:43

@Howdy_McGee por favor mira mi pregunta actualizada. Lo tengo funcionando, pero al revés.

JacobTheDev JacobTheDev
12 jun 2014 21:19:55
Todas las respuestas a la pregunta 2
0

Utilizando tu método, lo he editado un poco para hacerlo más viable. Aquí está el código, debajo explicaré.

<ul>
    <li><a href="<?php echo home_url(); ?>/projects">Proyectos</a></li>
    <?php
        $term = get_term_by("slug", get_query_var("term"), get_query_var("taxonomy") );

        $tmpTerm = $term;
        $tmpCrumbs = array();
        while ($tmpTerm->parent > 0){
            $tmpTerm = get_term($tmpTerm->parent, get_query_var("taxonomy"));
            $crumb = '<li><a href="' . get_term_link($tmpTerm, get_query_var('taxonomy')) . '">' . $tmpTerm->name . '</a></li>';
            array_push($tmpCrumbs, $crumb);
        }
        echo implode('', array_reverse($tmpCrumbs));
        echo '<li><a href="' . get_term_link($tmpTerm, get_query_var('taxonomy')) . '">' . $term->name . '</a></li>';
    ?>
</ul>

Después de obtener el término, lo asigno a un término temporal viable para poder sobrescribirlo. SI ese término tiene un padre, entramos en el bucle y obtenemos el padre del término original, pero lo asignamos a nuestro término temporal porque necesitamos subir hasta el término más alto, así que cuando el bucle se ejecuta nuevamente, verifica si term2 tiene un padre. Almacenamos el HTML en un array porque es más fácil invertirlo y mostrarlo en PHP. Si tienes alguna pregunta sobre lo anterior, avísame, ¡espero que te funcione!

¡Ah! También deberías dejar que WordPress se encargue de obtener los enlaces de los términos por ti, es mucho más confiable si los slugs cambian.

12 jun 2014 21:57:03
1

Lo resolví unos 10 minutos antes de que @Howdy_McGee publicara, pero pude usar parte de su código para mejorar el mío. Esto es lo que terminé usando:

$term = get_term_by("slug", get_query_var("term"), get_query_var("taxonomy") );
$parent = get_term($term->parent, get_query_var("taxonomy"));
$parentItems = array();
while ($parent->term_id) {
    array_push($parentItems,"<li><a href=\"" . home_url() . "/project-category/" . $parent->slug . "\">" . $parent->name . "</a></li>");
    $parent = get_term($parent->parent, get_query_var("taxonomy"));
}
echo implode (array_reverse($parentItems));
echo "<li><a href=\"" . home_url() . "/project-category/" . $term->slug . "\">" . $term->name . "</a></li>";
12 jun 2014 22:01:55
Comentarios

Tu respuesta debería ser una edición de la respuesta de @Howdy_McGee. Además, la respuesta de Howdy_McGee sigue siendo mejor; por ejemplo, no estás usando las funciones correctas para obtener el enlace del término.

cybmeta cybmeta
12 jun 2014 22:04:44