Navigazione a Breadcrumb per Tassonomia Personalizzata in WordPress

12 giu 2014, 19:17:03
Visualizzazioni: 15K
Voti: 2

Sono completamente nuovo ai custom post type e alle tassonomie personalizzate, quindi abbiate pazienza. Sto cercando di creare una navigazione a breadcrumb per la tassonomia personalizzata project-category all'interno del custom post type projects. In sostanza, deve funzionare così:

Custom Post Type > Livello 1 Tassonomia > Livello 2 Tassonomia > Livello 3 Tassonomia > ecc.

Ogni voce deve essere linkata alla pagina corrispondente. Ho un codice che più o meno funziona, ma non è molto dinamico e supporta solo tre livelli di navigazione. Ecco il mio codice attuale:

<ul>
    <li><a href="/projects">Progetti</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>

Fino al secondo livello questo codice funziona, mostrando:

Custom Post Type > Livello 1 Tassonomia > Livello 2 Tassonomia

Ma se scendo al terzo livello, ottengo:

Custom Post Type > Livello 2 Tassonomia > Livello 3 Tassonomia

Più scendo in profondità, più i livelli si spostano. So che il problema è che sto controllando solo un parent, ma non riesco a capire come controllare tutti i possibili parent.

AGGIORNAMENTO: Sono riuscito a migliorare il codice, ma ora elenca gli elementi al contrario. Ecco il codice aggiornato:

<ul>
    <li><a href="<? echo home_url(); ?>/projects">Progetti</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>

Invece di mostrare Custom Post Type > Livello 1 Tassonomia > Livello 2 Tassonomia > Livello 3 Tassonomia, mostra Custom Post Type > Livello 2 Tassonomia > Livello 1 Tassonomia > Livello 3 Tassonomia. Il problema è nel ciclo while, ma non riesco a invertire l'ordine.

Grazie.

3
Commenti

Avrai bisogno di qualche tipo di ciclo che continuerà a iterare fino a raggiungere un punto di arresto quando $term->parent == 0 <--- quello è il tuo punto di arresto, quando non ci sono più genitori da ottenere.

Howdy_McGee Howdy_McGee
12 giu 2014 19:40:10

Seriamente odio suggerire plugin come risposta, ma sto usando Hansel & Gretel: Fine-Tuned Breadcrumb Generator e mi piace davvero, da quando lo uso, niente più mal di testa per i breadcrumb ;)

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

@Howdy_McGee per favore guarda la mia domanda aggiornata. L'ho fatto funzionare, ma al contrario.

JacobTheDev JacobTheDev
12 giu 2014 21:19:55
Tutte le risposte alla domanda 2
0

Utilizzando il tuo metodo, l'ho modificato un po' per renderlo più funzionale. Ecco il codice, di seguito spiegherò.

<ul>
    <li><a href="<?php echo home_url(); ?>/projects">Progetti</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>

Dopo aver ottenuto il termine, lo assegno a un termine temporaneo modificabile così posso sovrascriverlo. SE quel termine ha un genitore entriamo nel ciclo e otteniamo il genitore del termine originale, ma lo assegniamo al nostro termine temporaneo perché dobbiamo risalire fino al termine più alto, così quando il ciclo viene eseguito nuovamente verifica se term2 ha un genitore. Memorizziamo l'HTML in un array perché è più semplice invertirlo e visualizzarlo in PHP. Se hai domande su quanto sopra fammi sapere, spero funzioni per te!

Oh! Inoltre dovresti lasciare che WordPress si occupi di ottenere i link dei termini per te, è molto più affidabile se gli slug cambiano.

12 giu 2014 21:57:03
1

Ho capito circa 10 minuti prima che @Howdy_McGee postasse, ma sono riuscito a utilizzare parte del suo codice per migliorare il mio. Ecco cosa ho ottenuto alla fine:

$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 giu 2014 22:01:55
Commenti

La tua risposta dovrebbe essere una modifica della risposta di @Howdy_McGee. Inoltre, la risposta di Howdy_McGee è ancora migliore; ad esempio, non stai utilizzando le funzioni corrette per ottenere il link del termine.

cybmeta cybmeta
12 giu 2014 22:04:44