Главная WordPress

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

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

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

  1. Спасибо, помогла статья.

  2. Отлично работает! Спасибо!

  3. Ребята уствновил все. но почему-то при перехоже например главная-каталог-товары-электроника-компы сзему показывает как главная-компы. что сделать чтобы выводилась вся схема движения? помогите плищщ

  4. Здравствуйте!

    Сейчас после выполнения кода получаю такую структуру:

    <div id="crumbs">
    <a href="#">Home</a>
    <a href="#">Category</a>
    <span class="current">Current Post</span>
    </div>
    

    Подскажите как обернуть ссылки в тег «li»? Чтобы получилось так:

    <div >
        <ul class="crumbs">
            <li><a href="#">Home</a></li>
            <li><a href="#">Category</a></li>
            <li><a href="#">Current Post</a></li>
        </ul>
    </div>
    

    ===
    Я ставил «li» перед и после каждого тега «a».
    Но получилось обернуть только пункт «Home».
    Делал примерно так:

    ...
    
    echo '<ul class="crumb"><li><a href="' . $homeLink . '">' . $home . '</a></li> ' . $delimiter . ' ';
    
    ...
    
    echo '</ul>';
       }
    } // end dimox_breadcrumbs()
    

    Спасибо!

  5. Если так не получается сделать, то буду использовать плагин Prime Strategy Bread Crumb (который только что нашел).

  6. Dimox может быть сможеш разобратся как сделать чтобы хлебные крошки работали на странице… допустим страница у меня «Новости» на ней выводятся заметки из категории допустим «Недвижимость» вот когда я на странице «Новости» перехожу по заметке то в хлебные крошки подстовляется уже не «Новости» а «Недвижимость» и потом название заметки…

    буду очень благодарен.

  7. Подскажите пожалуйста где в вашем скрипте поставить дополнительное условие, что бы …
    У меня такая ситуация что нужно вместо ссылки на определённые категории, выводить ссылку на определённый пост, а эта ссылка указана в custom field для текущего поста.

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

      $cat = get_the_category(); $cat = $cat[0];
      $cats = get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
      if ($showCurrent == 0) $cats = preg_replace("#^(.+)s$delimiters$#", "$1", $cats);
      echo $cats;
      

      На следующую:

      echo '<a href="' . get_post_meta($post->ID, 'link', true) . '">' . get_post_meta($post->ID, 'link', true) . '</a> ' . $delimiter . ' ';

      link — название произвольного поля.

      • Спасибо большое. Но ваш вариант мне не не много подошел, так как структура сайта немного странная, написал свой, выложу, может кому понадобится.
        Это:

                $cat = get_the_category(); $cat = $cat[0];
                $cats = get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
                if ($showCurrent == 0) $cats = preg_replace("#^(.+)s$delimiters$#", "$1", $cats);
                echo $cats;
        

        Заменил на это:

        	        $cat = get_the_category();
        	        if($cat[0]->term_id != 28 && $cat[0]->term_id != 27){
        				$cat = $cat[0];
        		        $cats = get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
        		        if ($showCurrent == 0) $cats = preg_replace("#^(.+)s$delimiters$#", "$1", $cats);
        		        echo $cats;
        	        } else{
        				$main_post = get_field("main-post");
        				$cats = get_the_category($main_post[0]->ID);
        				for ($i=count($cats)-1; $i >= 0; $i--) { 
        					echo '<a href="'.get_category_link( $cats[$i]->term_id).'">'.$cats[$i]->cat_name.'</a>'.$delimiter.' ';
        				}
        		      	echo '<a href="'.get_permalink($main_post[0]->ID).'">'.$main_post[0]->post_title.'</a>'.$delimiter.' ';
        	        }
        
  8. Спасибо Дмитрий за очередное полезное решение!
    У меня проблема. Хочу сделать свой стиль для ваших хлебных крошек.

    <span typeof="v:Breadcrumb"><a rel="v:url" property="v:title" href="http://www.site.ru/health" rel="category tag">Здоровье</a></span>

    Примерно так… это для rdf разметки.
    Ваш код не получилось модифицировать, так как get_the_category (); выдает только определенный стиль форматирования ссылки. В нее надо дописать часть атрибутов еще и удалить title.
    Можно как-то решить мою проблему?
    P.S: пробовал функцию от вп-кама… Там для дочерних рубрик получилось такое сделать, а для родительских нет.

  9. Здравствуйте, как добавить ссылку «Назад»
    Например такой вид: Главная / Блог/ Название статьи
    и ссылка «Назад» которая посылается на один элемент Назад. Главная / Блог

  10. Обнаружил что пропускается подкатегория для постов с галереей wordpress.
    Структура:
    Галерея → Фото → пост с галереей
    так в крошка отображается:
    Галерея → пост с галереей

    Подскажите, что может быть.

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

  12. Отличная функция, огромное спасибо!

  13. Отличный код функции! И блог такой хорошенький) А почему не Disqus для комментариев используете?

  14. подправил код для - кому нужен

    function dimox_breadcrumbs() {
        /* === ОПЦИИ === */
        $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      = ''; // тег перед текущей "крошкой"
        $after       = ''; // тег после текущей "крошки"
        /* === КОНЕЦ ОПЦИЙ === */
    
        global $post;
        $homeLink = get_bloginfo('url') . '/';
        $linkBefore = '<span typeof="v:Breadcrumb">';
        $linkAfter = '</span>';
        $linkAttr = ' rel="v:url" property="v:title"';
        $link = '<li>' . $linkBefore . '<a' . $linkAttr . ' href="%1$s">%2$s</a>' . $linkAfter . '</li>';
        if (is_home() || is_front_page()) {
            if ($showOnHome == 1)
                echo '<nav class="breadcrumbs"><div class="inner"><ul><li><a href="' . $homeLink . '">' . $text['home'] . '</a></li></ul></nav>';
        }
        else {
            echo '<nav class="breadcrumbs" xmlns:v="http://rdf.data-vocabulary.org/#"><div class="inner"><ul><li>' . sprintf($link, $homeLink, $text['home']) . '</li>';
            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', '<li>' . $linkBefore . '<a' . $linkAttr, $cats);
                    $cats = str_replace('</a>', '</a>' . $linkAfter . '</li>', $cats);
                    echo $cats;
                }
                echo '<li>' . $before . sprintf($text['category'], single_cat_title('', false)) . $after . '</li>';
            }
            elseif (is_search()) {
                echo '<li>' . $before . sprintf($text['search'], get_search_query()) . $after . '</li>';
            }
            elseif (is_day()) {
                echo sprintf($link, get_year_link(get_the_time('Y')), get_the_time('Y')) . $delimiter;
                echo sprintf($link, get_month_link(get_the_time('Y'),get_the_time('m')), get_the_time('F')) . $delimiter;
                echo '<li>' . $before . get_the_time('d') . $after . '</li>';
            }
            elseif (is_month()) {
                echo sprintf($link, get_year_link(get_the_time('Y')), get_the_time('Y')) . $delimiter;
                echo '<li>' . $before . get_the_time('F') . $after . '</li>';
            }
            elseif (is_year()) {
                echo '<li>' . $before . get_the_time('Y') . $after . '</li>';
            }
            elseif (is_single() && !is_attachment()) {
                if (get_post_type() != 'post') {
                    $post_type = get_post_type_object(get_post_type());
                    $slug = $post_type->rewrite;
                    printf($link, $homeLink . '/' . $slug['slug'] . '/', $post_type->labels->singular_name);
                    if ($showCurrent == 1) echo $delimiter . '<li>' . $before . get_the_title() . $after . '</li>';
            }
            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', '<li>' . $linkBefore . '<a' . $linkAttr, $cats);
                $cats = str_replace('</a>', '</a>' . $linkAfter . '</li>', $cats);
                echo $cats;
                if ($showCurrent == 1)
                    echo '<li>' . $before . get_the_title() . $after . '</li>';
                }
            }
            elseif (!is_single() && !is_page() && get_post_type() != 'post' && !is_404()) {
                $post_type = get_post_type_object(get_post_type());
                echo '<li>' . $before . $post_type->labels->singular_name . $after . '</li>';
            }
            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', '<li>' . $linkBefore . '<a' . $linkAttr, $cats);
                $cats = str_replace('</a>', '</a>' . $linkAfter . '</li>', $cats);
                echo $cats;
                printf($link, get_permalink($parent), $parent->post_title);
                if ($showCurrent == 1)
                    echo '<li>' . $delimiter . $before . get_the_title() . $after . '</li>';
            }
            elseif (is_page() && !$post->post_parent) {
                if ($showCurrent == 1)
                    echo '<li>' . $before . get_the_title() . $after . '</li>';
            }
            elseif (is_page() && $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++) {
                    echo $breadcrumbs[$i];
                    if ($i != count($breadcrumbs)-1)
                        echo $delimiter;
                }
                if ($showCurrent == 1)
                    echo '<li>' . $delimiter . $before . get_the_title() . $after . '</li>';
            }
            elseif (is_tag()) {
                echo '<li>' . $before . sprintf($text['tag'], single_tag_title('', false)) . $after . '</li>';
            }
            elseif (is_author()) {
                global $author;
                $userdata = get_userdata($author);
                echo '<li>' . $before . sprintf($text['author'], $userdata->display_name) . $after . '</li>';
            }
            elseif (is_404()) {
                echo '<li>' . $before . $text['404'] . $after . '</li>';
            }
            if (get_query_var('paged')) {
                echo '<li>';
                if (is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author())
                    echo ' (';
                echo __('Page') . ' ' . get_query_var('paged');
                if (is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author())
                    echo ')';
                echo '</li>';
            }
            echo '</ul></div></nav>';
        }
    } // end dimox_breadcrumbs()
    
  15. А Как сделать что бы последняя статья тоже была линком?

  16. Дим, еще вопрос по поводу снипетов в гугле, как сделать что бы снипеты выводились в гугле все т. е. главная, категория и статья сама (сейчас пока выводится в снипетах только категория)
    За ранее спасибо!

    • Зачем делать ссылку на текущую страницу? Ее в сниппете Гугла все равно не будет, там выводится только путь до текущей страницы.

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

      Я изменил код в соответствии с рекомендациями, Гугл сам на основе этого определяет, что выводить в результатах поиска.

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

    • кстати, а Вы под снипет Яндекса оптимзировали сайт?

      У Яндекса свои неведомые правила формирования хлебных крошек в выдаче. Полезная статья на эту тему.

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

      Не знаю, не сталкивался. Читайте инструкцию Гугла.

  18. Подскажите пожалуйста, как убрать тайтлы из хлебных крошек?

    Раньше у меня с этим боролся этот код:

    // удаляем title из ссылок категорий, страниц и тегов
    function removeTitle ($str){
    $str = preg_replace («/title=».*\"/", '', $str);
    return $str;
    }
    add_filter («wp_list_categories», «removeTitle»);
    add_filter («wp_list_pages», «removeTitle»);
    add_filter («the_category», «removeTitle»);

    Но это не срабатывает в случае с вашими хлебными крошками

  19. Dimox, еще такой вопрос.
    Как убрать отображение названия дочерней рубрики (когда в ней находишься) и соответственно разделитель (http://savepic.org/2 607 754.png)

    • Для этого есть опция $showCurrent.

      • Опция $showCurrent — показывает название текущей статьи/страницы — там все хорошо.
        Я же имел ввиду архив дочерней рубрики.

        • Я забыл, что эта опция не затрагивает рубрики (надо будет сделать).

          Поменяйте этот код:

          		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);
          				$cats = preg_replace('/ title="(.*?)"/', '', $cats);
          				echo $cats;
          			}
          			echo $before . sprintf($text['category'], single_cat_title('', false)) . $after;
          

          на такой:

          		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);
          				$cats = preg_replace("#^(.+)$delimiter$#", "$1", $cats);
          				$cats = preg_replace('/ title="(.*?)"/', '', $cats);
          				echo $cats;
          			}
          
  20. А в чем прикол не ставить принципиально плагины? Зачем тогда вордпрес? Может тогда лучше на фреймворке сделать свою систему? Зачем по вашему создаются плагины, и какой смысл в их использовании?

    • Хотел не согласиться, но не смог…

      В етом моменте вы правы… но бывают и другие, когда нужно сделать простую манипуляцыю с БД, а плагин создает лишнюю нагрузку, на те случаи и нужен файл фукнкций.

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