WordPress : Создайте ссылку в стиле хлебной крошки, используя ссылку get_post_type_archive_link

#wordpress #wordpress-theming #custom-post-type #breadcrumbs

Вопрос:

Я пытаюсь создать ссылку в стиле «хлебная крошка» на страницу архива/ленты для каждого из моих пользовательских типов сообщений для веб-сайта в стиле журнала, предпочтительно без необходимости создавать отдельный шаблон для каждого типа сообщений, поскольку их несколько. (Я также надеюсь, что смогу использовать ту же ссылку в стиле хлебной крошки в своем основном канале в виде избранных сообщений. НАПРИМЕР, над каждым H1 каждого показанного поста, чтобы, если кто-то нажмет «мода» вместо H1, он перейдет на эту страницу архива, как еще один способ просмотра сайта, в отличие от необходимости использовать навигацию меню верхнего уровня.)

Используя следующие:

$postType = get_post_type_object(get_post_type()); if ($postType) { echo "; echo esc_html($postType->метки->>имя); echo '
'; }
заголовок(", ");

Stackoverflow удалил HTML-части из приведенного выше кода, не знаю, что я там делаю не так

Он правильно выводит и отображает название типа публикации, например «Мода», однако возвращаемая ссылка предназначена для текущей публикации, а не для страницы ленты.

has_archive и hierarchical имеют значение true при создании типа публикации, и я обновил постоянные ссылки. У кого-нибудь есть решение?

Ответ №1:

Итак, у меня была связанная с этим проблема некоторое время назад, и, поскольку я презираю плагины, я решил сделать свою собственную хлебную крошку.

Вместо того чтобы полностью перейти на php, я пошел по дороге js. Хлебная крошка автоматически генерируется на основе текущего URL-адреса пользователя. Что намного эффективнее, чем строить все наоборот.

Контейнер для добавления в вашу тему, где бы:

 <ol id="bread"></ol>
 

Скрипт для постановки в очередь:

 var pathname = location.pathname;
if (((bread = []), pathname.endsWith("/"))) var crumbs = pathname.split("/").slice(1, -1);
else crumbs = pathname.split("/").slice(1);
for (crumb = 0; crumb < crumbs.length; crumb  ) {
    var url = location.href.split(crumbs[crumb])[0];
    if (crumbs[crumb].length > 35) var short = crumbs[crumb].replace(/-/g, " ").substring(0, 35)   "[...]";
    else short = crumbs[crumb].replace(/-/g, " ");
    bread.push('<li style="display:inline;padding:0 5px;"><a href="'   url   crumbs[crumb]   '">'   short   "</a></li>");
}
(document.getElementById("bread").innerHTML = bread.join(">")),
    (document.getElementById("bread").lastChild.style.pointerEvents = "none"),
    (document.getElementById("bread").lastChild.firstElementChild.style.textDecoration = "none"),
    (document.getElementById("bread").lastChild.firstElementChild.style.color = "inherit");
 

Хлебная крошка не стилизована, рядом display:inline;padding:0 5px; с которой отображается встроенный список, и ее можно легко изменить.

Вероятно, вы могли бы также добиться такого же поведения в php.

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

1. Спасибо, в итоге я заставил его работать с использованием чистого PHP, но я чувствую, что это было немного банально. Хотя она работает — дай мне знать, если захочешь посмотреть.

Ответ №2:

То, чего я добился с помощью PHP, было

 $postType = get_post_type_object(get_post_type());
if($postType) {
esc_html($postType->labels->link); echo esc_html($postType->labels->name);
}
 

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

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