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

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

Полезные комментарии (2)
Комментарии (627)
  1. 1
    Максим

    Значит не туда вставили код, внимательно просмотрите.

  2. 2

    Дима привет!

    скажи пожалуйста, я воспользовался твоим скриптом, но в проверке ГУгла микроданных что-то их не появилось, в чем может быть причина?

  3. 8

    Здравствуйте! Скажите пожалуйста, я использую шаблон index.php на странице http://site.ru/blog, и в крошках написано только «Главная». Как добавить слово Блог, т.е. чтобы было «Главная — Блог». Заранее спасибо!

  4. 11
    Петр

    При «пустом» поиске вордпресс даёт список всех статей, ваши «крошки» в этом случае не отображают никакой информации. Пожалуйста, доработайте этот момент, если считаете нужным.

  5. 12
    Сергей

    Здравствуйте! Такой вопрос у меня. Есть формат урл типа: Главная — Категория 1 — Категория 2 — Пост. Ваш код отлично все выдает, спасибо вам за это, но мне требуется дописать одно слово в хлебные крошки, вот как: Главная — Слово Категория 1 — Категория 2 — Пост, чтобы слово показывалось рядом с Категория 1, когда находишься в Категория 2 или в Пост. Пожалуйста помогите!

    • 13

      Это можно сделать только путем переименования категории.

    • 14
      David

      Это можно сделать только путем переименования категории.

      Интересное предположение, но я с Вами не соглашусь.

      чтобы слово показывалось рядом с Категория 1, когда находишься в Категория 2 или в Пост

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

      if ($show_current == 0) $cats = preg_replace("#^(.+)$delimiter$#", "$1", $cats); echo "Слово";

      на

      if ($show_current == 0) $cats = preg_replace("#^(.+)$delimiter$#", "$1", $cats); echo "Слово ";

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

  6. 16
    Роман
    @

    Спасибо за хлебные крошки, работают отлично!
    Dimox, скажите пожалуйста, как сделать так, чтобы название текущей страницы (рубрики и т.п.) не дублировалось в хлебных крошках. То есть чтобы совсем не отображался, например:

    Главная/Рубрика/

    Название статьи

    а не

    Главная/Рубрика/Название статьи

    Название статьи

  7. 18
    Михаил

    Здравствуйте, большое спасибо за хлебные крошки. Возник один вопрос, т.к. давно не работал с вордпрессом к сожалению никак не могу вспомнить как решить свою маленькую проблему. Имеется страница новостей, используется пагинация и при переходе по страницам в хлебные крошки добавляется page2 и тд, каким образом можно это убрать чтоб при переходе по страницам так и отображалось главная -> новости, а не главная->новостиpage2. Заранее спасибо за ответ

  8. 22
    Андрей
    @

    данный код выдает ошибку на страницу вложения (картинки) вот ссылка http://db-s.ru/doma_iz_brusa/d-10-zheleznodorozhnyj-6/.
    Причем эти страницы с ошибками проиндексировал гугл.
    Помогите решить проблему.
    Если убрать код из темы указанная ссылка с вложением открывается корректно.

  9. 23

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

    Catchable fatal error: Object of class WP_Error could not be converted to string in Z:\home\php.l\www\wp-content\themes\demo\functions.php on line 123
  10. 24

    Вот ещё заметил, если добавляешь произвольную таксономию и к ним произвольные записи, допустим такой код в функциях темы:

    /*Регистрация таксономии*/
    register_taxonomy(
    	'category-test',
    	array('test'),
    	array(
    		'hierarchical' => true,
    		'label' => 'Рубрики Тест',
    		'singular_label' => 'Рубрика Тест',
    		'rewrite' => array('slug' => '/category-test'),
    	)
    );
    /*Регистрация записей*/
    add_action('init', 'test_register');
    function test_register() {
    	$labels = array(
    		'name' => _x('Тест Записи', 'post type general name'),
    		'singular_name' => _x('Тест Запись', 'post type singular name'),
    		'parent_item_colon' => ''
    	);
    	$args = array(
    		'labels' => $labels,
    		'public' => true,
    		'publicly_queryable' => true,
    		'show_ui' => true,
    		'query_var' => true,
    		'rewrite' => array( 'slug' => '/category-test/%category-test%' ),
    		'capability_type' => 'post',
    		'hierarchical' => false,
    		'menu_position' => 5,
    		'has_archive' => 'category-test',
    		'supports' => array('title','editor','excerpt','custom-fields','thumbnail','author'),
    	);
    	register_post_type( 'test' , $args );
    	flush_rewrite_rules();
    }
    /*Регистрация слага для записей*/
    function wpa_test_permalinks( $post_link, $id = 0 ){
     $post = get_post($id);
     if ( is_object( $post ) && $post->post_type == 'test' ){
     $terms = wp_get_object_terms( $post->ID, 'category-test' );
     if( $terms ){
     return str_replace( '%category-test%' , $terms[0]->slug , $post_link );
     }
     }
     return $post_link;
    }
    add_filter( 'post_type_link', 'wpa_test_permalinks', 1, 2 );

    Ну и создаешь для них шаблоны: single-test.php и taxonomy-category-test.php.
    То в произвольных таксономиях/записях крошки не работают.

    Проверил в плагине wordpress-seo от yoast (там есть поддержка хлебных крошек), у него в окне «хлебных крошек» появляются все зарегистрированные таксономии и для них можно установить, для каждой таксономии — что отображать (В «хлебных крошках» установить таксономию для:).

    Спасибо за внимание, надеюсь не нагрузил и чем-то помог :)

  11. 25
    Дмитрий

    Здравствуйте ! Подскажите, а как вставить вместо «главная» картинку-ссылку на главную ?

  12. 28
    Unique

    Использую плагин для локализации WPML.
    Задача: При смене языка, менять вот этот текст на english

     $text['home'] = 'Главная';
    	$text['category'] = 'Архив рубрики "%s"';
    	$text['search'] = 'Результаты поиска по запросу "%s"';
    	$text['tag'] = 'Записи с тегом "%s"';
    	$text['author'] = 'Статьи автора %s';
    	$text['404'] = 'Ошибка 404';
    
    • 29
      <?php if(get_locale() == 'ru_RU') { ?>
       $text['home'] = 'Главная';
      	$text['category'] = 'Архив рубрики "%s"';
      	$text['search'] = 'Результаты поиска по запросу "%s"';
      	$text['tag'] = 'Записи с тегом "%s"';
      	$text['author'] = 'Статьи автора %s';
      	$text['404'] = 'Ошибка 404';
      <?php } else { ?>
       $text['home'] = 'Home';
      	$text['category'] = 'Category "%s"';
      	$text['search'] = 'Search "%s"';
      	$text['tag'] = 'Tag "%s"';
      	$text['author'] = 'Author' %s';
      	$text['404'] = 'Error 404';
      <?php } ?>

      Я бы сделал както так, пробовать надо непосредственно в коде =) Возможно php открытие и закрытие кодов не понадобится, это же и есть php все.

      • 30
        Cерж

        у Вас ошибка.

        <?php if(get_locale() == 'ru_RU') {
        $text['home'] = 'Главная'; 
         $text['category'] = 'Архив рубрики "%s"'; 
         $text['search'] = 'Результаты поиска по запросу "%s"'; 
         $text['tag'] = 'Записи с тегом "%s"'; 
         $text['author'] = 'Статьи автора %s'; 
         $text['404'] = 'Ошибка 404'; 
        } else {
        $text['home'] = 'Home'; 
         $text['category'] = 'Category "%s"'; 
         $text['search'] = 'Search "%s"'; 
         $text['tag'] = 'Tag "%s"'; 
         $text['author'] = 'Author' %s'; 
         $text['404'] = 'Error 404'; 
        } ?>
        

        дерзайте

  13. 31

    Добрый день а как бы сделать так чтобы эти крошки работали в woocommerce?

  14. 32
    Антон

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

    	#breadcrumbs { padding: 10px 5px 31px 4px; font: italic 12px Georgia, serif; color: #4e4d4d; text-shadow: 1px 1px 1px #ffffff; }
    		#breadcrumbs .sep { background:url("images/breadcrumbs_separator.png") no-repeat; display:inline-block; height:7px; margin:1px 1px 0 3px; width:4px; }
    		#breadcrumbs a { color: #807f7f; }
    		#breadcrumbs a:hover { text-decoration: none; color: #4e4d4d; }

    Я думал просто поменять breadcrumbs на crumbs, но так не работает. Заранее благодарен за ответ.

  15. 39
    Антон

    Dimox, а подскажите пожалуйста ещё, как в качестве разделителя между «крошками» вставить картинку. В CSS коде у меня за это отвечал код:

    .breadcrumbs .sep { background:url("images/breadcrumbs_separator.png") no-repeat; display:inline-block; height:7px; margin:1px 1px 0 3px; width:4px; }

    У вас в коде я нашел строчку:

    	$delimiter = ' &raquo; '; // разделить между "крошками"

    Но как правильно туда вставить это?

  16. 41
    Антон

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

    Особенность некорректности:
    Если первый символ названия подрубрики выше по алфавиту чем первый символ названия рубрики, навигационная цепочка отображается верно, даже если опубликована одновременно в рубрику и подрубрику. Если же первым по алфавиту идет название рубрики, а потом название подрубрики, то навигационная цепочка имеет вид:
    Главная -> Рубрика -> Название статьи, а должна иметь вид:
    Главная -> Рубрика -> Подрубрика -> Название статьи.

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

    В целом ваш плагин очень хорош, без применения плагинов лучшего варианта не встречал.
    Спасибо.

  17. 43

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

  18. 44
    Екатерина

    Здравствуйте!
    Подскажите, установила сее чудо, все прекрасно работает, спасибо!
    Но, есть проблемка, лично у меня, когда нажимаю на любую рубрику (категорию) в меню, то в каждой кратком статье — хлебные крошки.
    Т.е. если на страницах блога отображать не более — 5 записей, то и «крошек» будет тоже 5.
    Подскажите, как исправить? Спасибо Всем!

  19. 47

    Подскажите, пожалуйста, у меня после установки, отображается:
    главнаястраница1»»страница2

    т.е смещается разделитель. Если 2 страницы то нормально.

    В коде искал вроде все нормально, копировал как у Вас написано изменения не вносил.

    Спасибо.

  20. 52
    Максим

    Спасибо бро!

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

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