Хлебные крошки для произвольной таксономии в WordPress

12 июн. 2014 г., 19:17:03
Просмотры: 15K
Голосов: 2

Я совсем новичок в работе с произвольными типами записей и таксономиями, так что прошу терпения. Я пытаюсь создать навигацию в виде хлебных крошек для произвольной таксономии project-category внутри произвольного типа записей projects. По сути, мне нужно, чтобы это работало так:

Произвольный тип записей > Таксономия Уровень 1 > Таксономия Уровень 2 > Таксономия Уровень 3 > и т.д.

Каждый заголовок должен быть ссылкой на соответствующую страницу. У меня это как бы работает, но решение не очень динамичное и поддерживает только три уровня навигации. Вот мой текущий код:

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

До второго уровня это в данный момент работает, как показано ниже:

Произвольный тип записей > Таксономия Уровень 1 > Таксономия Уровень 2

Но если я перехожу на третий уровень, получается так:

Произвольный тип записей > Таксономия Уровень 2 > Таксономия Уровень 3

Чем глубже я захожу, тем больше сбивается порядок уровней. Я понимаю, что проблема в том, что я проверяю только одного родителя, но не могу понять, как проверить всех возможных родителей.

ОБНОВЛЕНИЕ: Мне удалось немного улучшить работу, но теперь элементы выводятся в обратном порядке. Вот обновленный код:

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

Вместо отображения Произвольный тип записей > Таксономия Уровень 1 > Таксономия Уровень 2 > Таксономия Уровень 3, он выводит Произвольный тип записей > Таксономия Уровень 2 > Таксономия Уровень 1 > Таксономия Уровень 3. Проблема в цикле while, но я не могу понять, как изменить порядок.

Спасибо.

3
Комментарии

Вам понадобится цикл, который будет продолжаться до достижения точки остановки $term->parent == 0 <--- это ваша точка остановки, когда больше нет родительских элементов для получения.

Howdy_McGee Howdy_McGee
12 июн. 2014 г. 19:40:10

Серьёзно, я не люблю предлагать плагины в качестве ответа, но я использую Hansel & Gretel: Fine-Tuned Breadcrumb Generator и мне он очень нравится — с тех пор как начал его использовать, никаких головных болей с хлебными крошками ;)

Jonathan Lafleur Jonathan Lafleur
12 июн. 2014 г. 20:16:43

@Howdy_McGee пожалуйста, посмотрите мой обновлённый вопрос. У меня получилось сделать, но в обратном порядке.

JacobTheDev JacobTheDev
12 июн. 2014 г. 21:19:55
Все ответы на вопрос 2
0

Используя ваш метод, я немного изменил его, чтобы сделать более жизнеспособным. Вот код, ниже я объясню.

<ul>
    <li><a href="<?php echo home_url(); ?>/projects">Проекты</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>

После получения термина я присваиваю его временной переменной, чтобы можно было перезаписывать. ЕСЛИ у этого термина есть родитель, мы входим в цикл и получаем родителя исходного термина, но присваиваем его нашей временной переменной, потому что нам нужно подняться до самого верхнего термина, поэтому при следующем запуске цикла проверяется, есть ли у term2 родитель. Мы сохраняем HTML в массив, потому что его легче развернуть и вывести в PHP. Если у вас есть вопросы по поводу вышеизложенного, дайте мне знать, надеюсь, это сработает для вас!

О! Также вам следует позволить WordPress самому заботиться о получении ссылок на термины, это намного надежнее, если меняются их ярлыки.

12 июн. 2014 г. 21:57:03
1

Разобрался примерно за 10 минут до публикации @Howdy_McGee, но смог использовать часть его кода для улучшения своего. Вот что у меня получилось в итоге:

$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 июн. 2014 г. 22:01:55
Комментарии

Ваш ответ должен быть редакцией ответа @Howdy_McGee. Кроме того, ответ Howdy_McGee всё ещё лучше; например, вы не используете правильные функции для получения ссылки на термин.

cybmeta cybmeta
12 июн. 2014 г. 22:04:44