«Хлебные крошки» для WordPress без использования плагина

«Хлебные крошки» — это важный элемент навигации веб-сайта, который повышает его юзабилити. Особенно это касается сайтов со сложной структурой. Я, к сожалению (а, может, и не к сожалению), не использую их на большинстве своих сайтов, возможно, потому, что у них слишком простая структура ...

Полезные комментарии (2)
Комментарии (557)
  1. 1
    Alex

    Как вывести title=»» к хлебным ссылкам?

  2. 4
    Andrey

    Добрый днь,

    Нужен хелп. После перехода со страницы новостей которая расположена по адресу domain.name/news на новость (новости в рубриках) domain.name/2017/04/02/news_item линк возврата на новости формируется почему-то domain.name/category/news. Подскажите как поправить?

  3. 8

    А я всё пытаюсь с помощью плагина seo by yoast сделать -)
    Гляну Ваш скрипт -)

  4. 9
    Andrey

    Подскажите еще такой вопрос.

    Установил плагин Easy testimonials. Все настроил все работает.

    Но когда переходишь на Testimonial то хлебные крошки получаются

    Главная -> Testimonial -> Вася Пупкин

    Подскажите, пожалуйста как модифицировать скрипт что бы слово Testimonial замнилось скажем на — «Отзыв»

  5. 10
    Dmitry

    Не работает.. в крошках некорректная ссылка %product_cat%

  6. 11
    Свя

    Все больше убеждаюсь что WP — огромный костыль

  7. 13
    Анатолий

    А можно как-то сделать, чтобы название поста можно было бы ввести вручную в хлебных крошках посредством создания специального поля в редактировании записи WP? Например, если его заголовок очень длинный и хотелось бы выводить его не весь, а, к примеру, 1-2 слова?

    • 14

      Замените эти строки:

      if ( get_query_var('cpage') ) {
      	echo $sep . sprintf($link, get_permalink(), get_the_title()) . $sep . $before . sprintf($text['cpage'], get_query_var('cpage')) . $after;
      } else {
      	if ($show_current) echo $before . get_the_title() . $after;
      }
      

      на такие:

      $title = get_the_title();
      $title_custom = get_post_meta(get_the_ID(), 'title', true);
      if ($title_custom) $title = $title_custom;
      if ( get_query_var('cpage') ) {
      	echo $sep . sprintf($link, get_permalink(), $title) . $sep . $before . sprintf($text['cpage'], get_query_var('cpage')) . $after;
      } else {
      	if ($show_current) echo $before . $title . $after;
      }
      

      Заголовок указывается через произвольное поле с именем «title».

  8. 15

    Отличный вариант. Три действия и все работает, а то с редактированием стандартных вариантов в темах обычно все сложно))). Спасибо

  9. 16

    Здравствуйте! Вопрос следующий, на страницах товаров woocommerce выводятся следующие крошки «Главная › Товар › Название товара». Как могу изменить название категории которое сейчас «Товар», на например «Товары» или «Витрина»?

  10. 18
    Наталья

    Добрый день!
    Подскажите, пожалуйста, как исправить:

    Я публикую статью (через создание записи, не страницы) и все запись/статьи собраны на одной странице www.website/news/

    Но при создании «Записи» (не страница), при выводе на экран хлебных крошек определяется не страница News, на которой сгруппированы все новости (адрес: website/news/название статьи), а первая отмеченная в записях рубрика, к которой относится запись (главная > название рубрики > название статьи)

    В настройках постоянных ссылок на сайте выбран формат www.website/sample-post/
    Записи имеют формат www.website/news/

    Как исправить чтобы в хлебных крошках определялась именно страница со всеми статьями, а не рубрика к которой относится запись?

    С уважением,
    Наталья

  11. 20
    Лариса

    здравствуйте! подскажите, пожалуйста, как сделать, чтобы не выводилась текущая категория, которая последняя и без ссылки?

    <nav class="woocommerce-breadcrumb">
    <a href="http://xn--4--8kctk0bgv.xn--p1ai">Главная</a>
    <span class="sep">›</span>
    <a href="http://xn--4--8kctk0bgv.xn--p1ai/products/">Продукция</a>
    <span class="sep">›</span> <a href="http://xn--4--8kctk0bgv.xn--p1ai/product-category/prazdniki/">Праздники</a>
    <span class="sep">›</span>
    <a href="http://xn--4--8kctk0bgv.xn--p1ai/product-category/prazdniki/prazdniki-prazdniki/">8 Марта</a>
    <span class="sep">›</span>
    <a href="http://xn--4--8kctk0bgv.xn--p1ai/product-category/prazdniki/prazdniki-prazdniki/8-marta/">Приколы и игры</a>
    <span class="sep">›</span>
    Игры
    </nav>
    
  12. 24

    Подскажите, пожалуйста, вставляю код в functions.php, которые прописаны, вставляю в шаблон. но пр этом после сохранение файла сайт сразу ложится :-(

    Я что-то не так делаю, или есть ошибка в коде?

  13. 26

    Спасибо за крошек, пригодились. :)
    Cудя по документации Google и Schema.org вам не хватает,чтобы последняя крошка тоже была размечена.
    Иначе сейчас в Google Structured Data Testing Tool отображается не вся цепочка.
    Достаточно добавить к элементам:

     <link itemprop="url" content="#ссылка" />

    В данном случае нельзя поставить meta, на который ругается Яндекс.Валидатор

    Плюс было бы классно добавить нумерацию:

    <meta itemprop="position" content="#позиция" />

    В итог получается как-то так, но я не знаю, как автоматизировать верное проставление нумерации цепочки и как добавить ссылку в последнюю крошку. :(

     $wrap_before = '<div class="breadcrumbs" itemscope itemtype="http://schema.org/BreadcrumbList">'; 
     $wrap_after = '</div>'; 
     $sep = '>'; 
     $sep_before = '<span class="sep">'; 
     $sep_after = '</span>'; 
     $show_home_link = 1; 
     $show_on_home = 0; 
     $show_current = 1; 
     $before = '<span class="current" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><span itemprop="item"><span itemprop="name">'; 
     $after = '</span><link itemprop="url" href="#ссылка" /></span><meta itemprop="position" content="#позиция" /></span>'; 
    
     global $post;
     $home_url = home_url('/');
     $link_before = '<span itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">';
     $link_after = '</span>';
     $link_attr = ' itemprop="item"';
     $link_in_before = '<span itemprop="name">';
     $link_in_after = '</span>';
     $link = $link_before . '<a href="%1$s"' . $link_attr . '>' . $link_in_before . '%2$s' . $link_in_after . '<meta itemprop="position" content="#позиция" /></a>' . $link_after;
     $frontpage_id = get_option('page_on_front');
     $parent_id = ($post) ? $post->post_parent : '';
     $sep = ' ' . $sep_before . $sep . $sep_after . ' ';
     $home_link = $link_before . '<a href="' . $home_url . '"' . $link_attr . ' class="home">' . $link_in_before . $text['home'] . $link_in_after . '</a><meta itemprop="position" content="1" />' . $link_after;
    
    • 27

      Cудя по документации Google и Schema.org вам не хватает,чтобы последняя крошка тоже была размечена.

      Если речь про крошку текущей страницы, то по указанным ссылкам ее вообще нет. Там последняя ссылка — это ссылка на родителя. Ссылку на саму себя ставить не логично.

      • 28

        Нет, Ancillary Justiceв (книга такая) в примере Google — это не ссылка на родителя, а текущая страница — ancillaryjustice.html (выше над примерами пояснение).

        А ещё

        item - Thing, required

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

  14. 29
    @

    Подскажите, когда в вордпрее выбираем в настройках страницу блога, хлебные крошки на данной странице перестают работать
    Возможно исправить это ?

  15. 39
    Максим
    @

    Не подскажите, как убрать ссылку на главной, если я на ней нохожусь?
    это значение поставил в 0 и всё равно ссылка осталась; $show_home_link = 0;

  16. 41
    Александр
    @

    Здравствуйте. Спасибо за прекрасное решение. Подскажите, пожалуйста, возможно ли решить следующую проблему: крошки работают идеально при условии, что для записи оставлена галка только на подрубрике. Если ставить две галки, указывая и родительскую рубрику, и дочернюю, в крошках отображается полный путь до записи только для первой подрубрики. Например, при схеме:
    Рубрика
    Подрубрика1
    Подрубрика2

    крошки будут выглядеть так:
    Главная > Рубрика > Подрубрика 1
    Главная > Рубрика

    Спасибо.

  17. 43
    Александр
    @

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

  18. 44
    Алексей

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

  19. 46

    Хотел установить, но прочел, что проблемы с разметкой. Только настроил сниппет рейтинга для гугла и боюсь теперь ставить хлебные крошки. Скажите пожалуйста они друг-другу не будут мешать?
    У меня на сайте, в принципе, не глубокая вложенность. Главная->Категория->Игра. Посоветуйте пожалуйста как реализовать.

  20. 48

    Единственное, что теперь останется сделать — оформить их с помощью CSS. Для этого к блоку «хлебных крошек» предусмотрен класс .breadcrumbs, для разделителя — .sep а для текущей «крошки» — .current.

    Я не программист, вот этот абзац вообще не понимаю. Можете гражданским языком написать, что нужно сделать, пожалуйста*

  1. 1
    DH

    Для таксономий добавьте:

    } elseif ( is_tax() ) {
     if ($show_home_link &amp;&amp; $show_current) echo $sep;
     $term = get_queried_object();
     if ( $term ) {
     $tax = get_taxonomy( $term->taxonomy );
     $title = single_term_title( $tax->labels->name. ': ', false );
     echo $title;
     }
    

    где-нибудь перед

    } elseif ( is_day() ) {
  2. 2

    Замените эти строки:

    if ( get_query_var('cpage') ) {
    	echo $sep . sprintf($link, get_permalink(), get_the_title()) . $sep . $before . sprintf($text['cpage'], get_query_var('cpage')) . $after;
    } else {
    	if ($show_current) echo $before . get_the_title() . $after;
    }
    

    на такие:

    $title = get_the_title();
    $title_custom = get_post_meta(get_the_ID(), 'title', true);
    if ($title_custom) $title = $title_custom;
    if ( get_query_var('cpage') ) {
    	echo $sep . sprintf($link, get_permalink(), $title) . $sep . $before . sprintf($text['cpage'], get_query_var('cpage')) . $after;
    } else {
    	if ($show_current) echo $before . $title . $after;
    }
    

    Заголовок указывается через произвольное поле с именем «title».

Ваш комментарий