Navigație prin filă de navigare pentru taxonomii personalizate

12 iun. 2014, 19:17:03
Vizualizări: 15K
Voturi: 2

Sunt complet nou în tipurile de postări personalizate și taxonomiile personalizate, așa că aveți răbdare cu mine. Încerc să creez o filă de navigare pentru taxonomia personalizată project-category în cadrul tipului de postare personalizat projects. În esență, trebuie să funcționeze astfel:

Tip Postare Personalizată > Nivel Taxonomie 1 > Nivel Taxonomie 2 > Nivel Taxonomie 3 > etc.

Fiecare titlu trebuie să fie legat la pagina corespunzătoare. Am reușit să fac asta într-un fel, dar nu este foarte dinamic și leagă doar trei niveluri de navigare. Iată codul meu pentru asta:

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

Până la al doilea nivel, acest cod funcționează în prezent, astfel:

Tip Postare Personalizată > Nivel Taxonomie 1 > Nivel Taxonomie 2

Dar dacă merg la un al treilea nivel, rezultatul este:

Tip Postare Personalizată > Nivel Taxonomie 2 > Nivel Taxonomie 3

Cu cât merg mai adânc, cu atât nivelurile devin mai derutate. Știu că problema este că verific doar un părinte, dar nu pot să-mi dau seama cum să verific pentru toți părinții posibili.

ACTUALIZARE: Am reușit să-l fac să funcționeze puțin mai bine, dar listează elementele în ordine inversă. Iată codul actualizat:

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

În loc să listeze Tip Postare Personalizată > Nivel Taxonomie 1 > Nivel Taxonomie 2 > Nivel Taxonomie 3, listează Tip Postare Personalizată > Nivel Taxonomie 2 > Nivel Taxonomie 1 > Nivel Taxonomie 3. Este ceva legat de bucla while, dar nu reușesc să o inversez.

Mulțumesc.

3
Comentarii

Vei avea nevoie de un fel de buclă care va continua să ruleze până când ajunge la punctul de oprire $term->parent == 0 <--- acesta este punctul tău de oprire, unde nu mai există părinți de obținut.

Howdy_McGee Howdy_McGee
12 iun. 2014 19:40:10

Sincer, urăsc să recomand pluginuri ca răspuns, dar folosesc Hansel & Gretel: Fine-Tuned Breadcrumb Generator și îmi place foarte mult, de când îl folosesc, nu mai am dureri de cap cu breadcrumbs-urile ;)

Jonathan Lafleur Jonathan Lafleur
12 iun. 2014 20:16:43

@Howdy_McGee te rog să vezi întrebarea mea actualizată. Am reușit să o fac să funcționeze, dar în ordine inversă.

JacobTheDev JacobTheDev
12 iun. 2014 21:19:55
Toate răspunsurile la întrebare 2
0

Folosind metoda ta, am editat-o puțin pentru a o face mai viabilă. Iată codul, mai jos voi explica.

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

După ce obții termenul, îl atribui unei variabile temporare pentru a putea suprascrie valoarea. Dacă acest termen are un părinte, intrăm în buclă și obținem părintele termenului original, dar îl atribuim termenului nostru temporar deoarece trebuie să urcăm până la termenul cel mai înalt, astfel încât când bucla se execută din nou verifică dacă termenul2 are părinte. Stocăm HTML-ul într-un array pentru că este mai ușor să-l inversăm și să-l afișăm în PHP. Dacă ai întrebări despre cele de mai sus, spune-mi, sper să funcționeze pentru tine!

A, da! De asemenea, ar trebui să lași WordPress să se ocupe de generarea linkurilor pentru termeni, este mult mai sigur dacă slug-urile se schimbă.

12 iun. 2014 21:57:03
1

Am rezolvat problema cu aproximativ 10 minute înainte ca @Howdy_McGee să posteze, dar am putut folosi o parte din codul lui pentru a-mi îmbunătăți soluția. Iată ce am folosit în final:

$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 iun. 2014 22:01:55
Comentarii

Răspunsul tău ar trebui să fie o editare a răspunsului lui @Howdy_McGee. De asemenea, răspunsul lui Howdy_McGee este în continuare mai bun; de exemplu, tu nu folosești funcțiile corecte pentru a obține link-ul termenului.

cybmeta cybmeta
12 iun. 2014 22:04:44