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

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

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

    для Custom Post Type эти «хлебные крошки» сработают?

  2. 3
    Константин

    Как убрать отображение категории?

  3. 4

    Здравствуйте. Подскажите а куда именно в functions.php надо ставить код? Я поставила в самом конце вышла лажа. А плагин не могу поставить потому что есть сложности с обновлением до более новой версии. Я так один сайт обновила и он просто пропал. Вернее он отражается но в админку не могу войти. Точнее вхожу но там ничего НЕТ. Подскажите пожалуйста.

  4. 6
    Toperwm

    Каким образом можно к ссылке «Главная» добавить rel=»nofollow» и «noindex» ?. А остальные ссылки отсавить без изменений

  5. 10
    Дмитрий

    Спасибо! Пытался сам гугловскую разметку добавить и, естественно, ничего не получалось.

  6. 11
    Валерий

    Здравствуйте! Все замечательно получилось, но хотелось бы немножко поправить.
    У меня вот так отображается: Главная Рубрика » » Статья
    а хотелось бы вот так: Главная » Рубрика » Статья

    Подскажите пожалуйста как исправить?

  7. 14

    Я тут заметил. Если в посте использовать хлебные крошки, то формируется такой код:

    <a href="http://hearthstone-heroes-of-warcraft.ru" title="Hearthstone: Heroes of Warcraft">Hearthstone</a> › <a title="рубрике «Разное»" href="http://hearthstone-heroes-of-warcraft.ru/raznoe">Разное</a> › <span class="current">Вся известная информация по Hearthstone</span>

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

    Если что — вот мой код, который использую:

    function dimox_breadcrumbs() {
    
     $showOnHome = 0;
     $delimiter = '&rsaquo;';
     $home = 'Hearthstone';
     $showCurrent = 1;
     $before = '<span class="current">';
     $after = '</span>';
    
     global $post;
     $homeLink = get_bloginfo('url');
    
     if (is_home() || is_front_page()) {
    
     if ($showOnHome == 1) echo '<a title="Hearthstone: Heroes of Warcraft" href="' . $homeLink . '">' . $home . '</a></div>';
    
     } else {
    
     echo '<a title="Hearthstone: Heroes of Warcraft" href="' . $homeLink . '">' . $home . '</a> ' . $delimiter . ' ';
    
     if ( is_category() ) {
     global $wp_query;
     $cat_obj = $wp_query->get_queried_object();
     $thisCat = $cat_obj->term_id;
     $thisCat = get_category($thisCat);
     $parentCat = get_category($thisCat->parent);
     if ($thisCat->parent != 0) echo(get_category_parents($parentCat, TRUE, ' ' . $delimiter . ' '));
     echo $before . 'Рубрика "<h1>' . single_cat_title('', false) . '</h1>"' . $after;
    
     } elseif ( is_search() ) {
     echo $before . 'Результаты поиска по запросу "' . get_search_query() . '"' . $after;
    
     } elseif ( is_day() ) {
     echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' ';
     echo '<a href="' . get_month_link(get_the_time('Y'),get_the_time('m')) . '">' . get_the_time('F') . '</a> ' . $delimiter . ' ';
     echo $before . get_the_time('d') . $after;
    
     } elseif ( is_month() ) {
     echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' ';
     echo $before . get_the_time('F') . $after;
    
     } elseif ( is_year() ) {
     echo $before . get_the_time('Y') . $after;
    
     } elseif ( is_single() && !is_attachment() ) {
     if ( get_post_type() != 'post' ) {
     $post_type = get_post_type_object(get_post_type());
     $slug = $post_type->rewrite;
     echo '<a title="Hearthstone: Heroes of Warcraft" href="' . $homeLink . '/' . $slug['slug'] . '/">' . $post_type->labels->singular_name . '</a>';
     if ($showCurrent == 1) echo ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
     } else {
     $cat = get_the_category(); $cat = $cat[0];
     $cats = get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
     if ($showCurrent == 0) $cats = preg_replace("/^(.+)\s$delimiter\s$/", "$1", $cats);
    	$cats = str_replace('Просмотреть все записи в ', '', $cats);
     echo $cats;
     if ($showCurrent == 1) echo $before . get_the_title() . $after;
     }
    
     } elseif ( !is_single() && !is_page() && get_post_type() != 'post' && !is_404() ) {
     $post_type = get_post_type_object(get_post_type());
     echo $before . $post_type->labels->singular_name . $after;
    
     } elseif ( is_attachment() ) {
     $parent = get_post($post->post_parent);
     $cat = get_the_category($parent->ID); $cat = $cat[0];
     echo get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
     echo '<a href="' . get_permalink($parent) . '">' . $parent->post_title . '</a>';
     if ($showCurrent == 1) echo ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
    
     } elseif ( is_page() && !$post->post_parent ) {
     if ($showCurrent == 1) echo $before . get_the_title() . $after;
    
     } elseif ( is_page() && $post->post_parent ) {
     $parent_id = $post->post_parent;
     $breadcrumbs = array();
     while ($parent_id) {
     $page = get_page($parent_id);
     $breadcrumbs[] = '<a href="' . get_permalink($page->ID) . '">' . get_the_title($page->ID) . '</a>';
     $parent_id = $page->post_parent;
     }
     $breadcrumbs = array_reverse($breadcrumbs);
     for ($i = 0; $i < count($breadcrumbs); $i++) {
     echo $breadcrumbs[$i];
     if ($i != count($breadcrumbs)-1) echo ' ' . $delimiter . ' ';
     }
     if ($showCurrent == 1) echo ' ' . $delimiter . ' ' . $before . get_the_title() . $after;
    
     } elseif ( is_tag() ) {
     echo $before . 'Записи с тегом "<h1>' . single_tag_title('', false) . '</h1>"' . $after;
    
     } elseif ( is_author() ) {
     global $author;
     $userdata = get_userdata($author);
     echo $before . 'Статьи автора ' . $userdata->display_name . $after;
    
     } elseif ( is_404() ) {
     echo $before . 'Error 404' . $after;
     }
    
     if ( get_query_var('paged') ) {
     if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() ) echo ' (';
     echo __('Страница') . ' ' . get_query_var('paged');
     if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() ) echo ')';
     }
     }
    }
  8. 17

    Спасибо за код! все отлично работает!
    Вы не могли бы подсказать, как убрать «Главная» из этой цепочки? Мне нужно чтобы просто была Рубрика-Подрубрика-Запись.

  9. 20
    Сергей

    как закрыть ссылки в хлебных крошках в нофоллов?

  10. 21

    Отлично! Спасибо! Именно то, что нужно. Сам стараюсь по-возможности избегать плагинов. В то же время не пытаюсь изобрести велосипед, если есть готовые решения. Ваше — самое продуманное. Еще раз спасибо и удачи во всем.

  11. 22

    Здравствуйте! Использую этот код, но выводятся Главная » Рубрика » Название статьи
    Подрубрики не выводятся. Не знаете что может быть?

  12. 24
    Leonid

    Здравствуйте.
    А работает ли эта функция со страницами (главная/родительская/дочерняя…) , а не с постами в рубриках?

  13. 27
    WPixel

    Валидатор ругается на эти крошки, что можно подправить в коде чтоб был семантичным?

  14. 29
    Артём

    Модифицировал код для себя, чтобы работал через shortcode и имел два языка.

    [breadcrumbs lang=ru]
    function dimox_breadcrumbs_sc($attr)
    {
     
     $lang = $attr['lang'];
     
     /* === ОПЦИИ === */
     
     if($lang == '' OR $lang == 'en') // English for default
     {
     $text['home'] = 'Home'; // текст ссылки "Главная"
     $text['category'] = 'Category archive "%s"'; // текст для страницы рубрики
     $text['search'] = 'Search results for "%s"'; // текст для страницы с результатами поиска
     $text['tag'] = 'With tag "%s"'; // текст для страницы тега
     $text['author'] = 'Autor posts %s'; // текст для страницы автора
     $text['404'] = 'Error 404'; // текст для страницы 404
     }
     else
     {
     $text['home'] = 'Главная'; // текст ссылки "Главная"
     $text['category'] = 'Архив рубрики "%s"'; // текст для страницы рубрики
     $text['search'] = 'Результаты поиска по запросу "%s"'; // текст для страницы с результатами поиска
     $text['tag'] = 'Записи с тегом "%s"'; // текст для страницы тега
     $text['author'] = 'Статьи автора %s'; // текст для страницы автора
     $text['404'] = 'Ошибка 404'; // текст для страницы 404
     }
    
     $showCurrent = 1; // 1 - показывать название текущей статьи/страницы, 0 - не показывать
     $showOnHome = 0; // 1 - показывать "хлебные крошки" на главной странице, 0 - не показывать
     $delimiter = ' / '; // разделить между "крошками"
     $before = '<span class="current">'; // тег перед текущей "крошкой"
     $after = '</span>'; // тег после текущей "крошки"
     /* === КОНЕЦ ОПЦИЙ === */
    
     global $post;
     $homeLink = get_bloginfo('url') . '/';
     $linkBefore = '<span typeof="v:Breadcrumb">';
     $linkAfter = '</span>';
     $linkAttr = ' rel="v:url" property="v:title"';
     $link = $linkBefore . '<a' . $linkAttr . ' href="%1$s">%2$s</a>' . $linkAfter;
     
     $dimox_breadcrumbs = '';
     
     if( is_home() OR is_front_page() )
     {
     if ($showOnHome == 1)
     {
     $dimox_breadcrumbs .= '<div id="crumbs"><a href="' . $homeLink . '">' . $text['home'] . '</a></div>';
     }
     }
     else
     {
     $dimox_breadcrumbs .= '<div id="crumbs" xmlns:v="http://rdf.data-vocabulary.org/#">' . sprintf($link, $homeLink, $text['home']) . $delimiter;
     
     if( is_category() )
     {
     $thisCat = get_category(get_query_var('cat'), false);
     
     if ($thisCat->parent != 0)
     {
     $cats = get_category_parents($thisCat->parent, TRUE, $delimiter);
     $cats = str_replace('<a', $linkBefore . '<a' . $linkAttr, $cats);
     $cats = str_replace('</a>', '</a>' . $linkAfter, $cats);
     
     $dimox_breadcrumbs .= $cats;
     }
     
     $dimox_breadcrumbs .= $before . sprintf($text['category'], single_cat_title('', false)) . $after;
     
     }
     elseif( is_search() )
     {
     $dimox_breadcrumbs .= $before . sprintf($text['search'], get_search_query()) . $after;
     }
     elseif( is_day() )
     {
     $dimox_breadcrumbs .= sprintf($link, get_year_link(get_the_time('Y')), get_the_time('Y')) . $delimiter;
     $dimox_breadcrumbs .= sprintf($link, get_month_link(get_the_time('Y'),get_the_time('m')), get_the_time('F')) . $delimiter;
     $dimox_breadcrumbs .= $before . get_the_time('d') . $after;
     }
     elseif( is_month() )
     {
     $dimox_breadcrumbs .= sprintf($link, get_year_link(get_the_time('Y')), get_the_time('Y')) . $delimiter;
     $dimox_breadcrumbs .= $before . get_the_time('F') . $after;
     }
     elseif( is_year() )
     {
     $dimox_breadcrumbs .= $before . get_the_time('Y') . $after;
     
     }
     elseif( is_single() AND !is_attachment() )
     {
     if( get_post_type() != 'post' )
     {
     $post_type = get_post_type_object(get_post_type());
     $slug = $post_type->rewrite;
     $dimox_breadcrumbs .= printf($link, $homeLink . '/' . $slug['slug'] . '/', $post_type->labels->singular_name);
     
     if ($showCurrent == 1)
     {
     $dimox_breadcrumbs .= $delimiter . $before . get_the_title() . $after;
     }
     }
     else
     {
     $cat = get_the_category(); $cat = $cat[0];
     $cats = get_category_parents($cat, TRUE, $delimiter);
     
     if ($showCurrent == 0)
     {
     $cats = preg_replace("#^(.+)$delimiter$#", "$1", $cats);
     }
     
     $cats = str_replace('<a', $linkBefore . '<a' . $linkAttr, $cats);
     $cats = str_replace('</a>', '</a>' . $linkAfter, $cats);
     
     $dimox_breadcrumbs .= $cats;
     
     if($showCurrent == 1)
     {
     $dimox_breadcrumbs .= $before . get_the_title() . $after;
     }
     }
     
     }
     elseif( !is_single() AND !is_page() AND get_post_type() != 'post' AND !is_404() )
     {
     $post_type = get_post_type_object(get_post_type());
     $dimox_breadcrumbs .= $before . $post_type->labels->singular_name . $after;
     }
     elseif( is_attachment() )
     {
     $parent = get_post($post->post_parent);
     $cat = get_the_category($parent->ID); $cat = $cat[0];
     $cats = get_category_parents($cat, TRUE, $delimiter);
     $cats = str_replace('<a', $linkBefore . '<a' . $linkAttr, $cats);
     $cats = str_replace('</a>', '</a>' . $linkAfter, $cats);
     
     $dimox_breadcrumbs .= $cats;
     printf($link, get_permalink($parent), $parent->post_title);
     
     if ($showCurrent == 1)
     {
     $dimox_breadcrumbs .= $delimiter . $before . get_the_title() . $after;
     }
     
     }
     elseif( is_page() AND !$post->post_parent )
     {
     if ($showCurrent == 1)
     {
     $dimox_breadcrumbs .= $before . get_the_title() . $after;
     }
     }
     elseif( is_page() AND $post->post_parent )
     {
     $parent_id = $post->post_parent;
     $breadcrumbs = array();
     while($parent_id)
     {
     $page = get_page($parent_id);
     $breadcrumbs[] = sprintf($link, get_permalink($page->ID), get_the_title($page->ID));
     $parent_id = $page->post_parent;
     }
     
     $breadcrumbs = array_reverse($breadcrumbs);
     
     for($i = 0; $i < count($breadcrumbs); $i++)
     {
     $dimox_breadcrumbs .= $breadcrumbs[$i];
     if ($i != count($breadcrumbs)-1)
     {
     $dimox_breadcrumbs .= $delimiter;
     }
     }
     
     if($showCurrent == 1) 
     {
     $dimox_breadcrumbs .= $delimiter . $before . get_the_title() . $after;
     }
     
     }
     elseif( is_tag() )
     {
     $dimox_breadcrumbs .= $before . sprintf($text['tag'], single_tag_title('', false)) . $after;
     
     }
     elseif( is_author() )
     {
     global $author;
     $userdata = get_userdata($author);
     $dimox_breadcrumbs .= $before . sprintf($text['author'], $userdata->display_name) . $after;
     }
     elseif( is_404() )
     {
     $dimox_breadcrumbs .= $before . $text['404'] . $after;
     }
     
     if( get_query_var('paged') )
     {
     if(
     is_category() 
     OR is_day() 
     OR is_month() 
     OR is_year() 
     OR is_search() 
     OR is_tag() 
     OR is_author()
     )
     {
     $dimox_breadcrumbs .= ' (';
     }
     $dimox_breadcrumbs .= __('Page') . ' ' . get_query_var('paged');
     
     if(
     is_category()
     OR is_day() 
     OR is_month() 
     OR is_year() 
     OR is_search() 
     OR is_tag() 
     OR is_author()
     )
     {
     $dimox_breadcrumbs .= ')';
     }
     }
     
     $dimox_breadcrumbs .= '</div>';
     
     }
     
     return $dimox_breadcrumbs;
     
    } // end dimox_breadcrumbs()
    
    add_shortcode( 'breadcrumbs', 'dimox_breadcrumbs_sc' );
    
  15. 30

    Дмитрий, добрый день!
    У меня почему то не выводится наименование главной страницы.
    И никак не могу css настроить.
    Помогите, пожалуйста.

  16. 37
    Валерий

    Дмитрий, здравствуйте. Спасибо за плагин, очень помогает! Не подскажите, в чем может быть проблема, при использовании вашего кода на мультисайте. На основном сайте все хорошо, а на поддомене проблемы — на страницах категорий, тэгов все нормально. На странице поста — всегда отображает крошки для самой первой записи в блоге. Такая же ситуация на страницах (page). Может быть подскажете, в какую сторону копать? Вроде бы используется глобальная переменная $post…

  17. 39

    Здравствуйте! Спасибо большое за полезную разработку. Подскажите пожалуйста, я использую эти крошки в index.php и вывожу их так:

    <?php if ( (is_home())&&!(is_paged()) ) { ?>
    <?php } else { ?>
     <div class="post-top"></div><div class="post"><?php if (function_exists('dimox_breadcrumbs')) dimox_breadcrumbs(); ?></div>
     <div class="clear"></div>
     <div class="post-bottom-crumbs"></div>
    <?php } ?>

    То есть, мне нужно чтобы именно на главной странице они не выводились, но во всех остальных случаях — выводились.

    Все отлично, но вот если с главной перейти на вторую страницу, показывается только ссылка на главную (хотя должно быть примерно так: «Главная — (Страница 2)»).

    Как это происходит, можете посмотреть у меня на сайте http://vladmaxi.net, и перейдя на вторую страницу цикла статей на главной.

    Буду благодарен за помощь! Спасибо!

  18. 40

    P.S. Например, если перейти по ссылке http://vladmaxi.net/page/2, то показывается один домик, без подписи «Страница 2». А если зайти в какую-то категорию, и открыть 2-ую страницу, то пишет все как положено. Как это исправить? Спасибо

  19. 43
    Дмитрий

    Добрый день.
    Установил Ваш код, все без ошибок. Проблема такая, если я залогинен то я вижу «Хлебные крошки», а если нет, то они не показываются.
    Почему такое?

  20. 44

    Либо на сайте используется кеширование, либо в шаблоне используется код, который выводит крошки только для админа, либо что-то еще.

  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».

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