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

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

Комментарии (672)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  14. Модифицировал код для себя, чтобы работал через 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. Дмитрий, добрый день!
    У меня почему то не выводится наименование главной страницы.
    И никак не могу css настроить.
    Помогите, пожалуйста.

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

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

    • Нужно заменить этот код:

      if ($show_on_home == 1) echo '<div class="breadcrumbs"><a href="' . $home_link . '">' . $text['home'] . '</a></div>';

      на следующий:

      
      if ($show_on_home == 1) echo '<div class="breadcrumbs"><a href="' . $home_link . '">' . $text['home'] . '</a>';
      if ( get_query_var('paged') ) echo ' (Страница ' . get_query_var('paged') . ')';
      echo '</div><!-- .breadcrumbs -->';
      
  19. Добрый день.
    Установил Ваш код, все без ошибок. Проблема такая, если я залогинен то я вижу «Хлебные крошки», а если нет, то они не показываются.
    Почему такое?

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

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