“Хлебные крошки” для WordPress без использования плагина
“Хлебные крошки” - это важный элемент навигации веб-сайта, который повышает его юзабилити. Особенно это касается сайтов со сложной структурой. Я, к сожалению (а, может, и не к сожалению), не использую их на большинстве своих сайтов, возможно, потому, что у них слишком простая структура (для такого сайта, как этот, они, вроде бы, и не нужны).
Когда я решаю какую-либо задачу на WordPress-сайте, то всегда стараюсь обходится без плагинов, где это бывает возможно. Зачастую одна и та же задача может быть решена с меньшим количеством кода и бывает менее ресурсоемкой по сравнению с применением плагинов (кстати, пользуясь случаем, рекомендую еще один мой блог - WPhacks.name, на котором я публикую различные PHP-хаки для WordPress).
В Интернете я находил разные варианты реализации “хлебных крошек” без использования плагинов, но ни один из них меня не устроил, поскольку все они не показывали полную цепочку ссылок. Поэтому я создал свою функцию “хлебных крошек” для WordPress. И в данном посте хочу поделиться этой функцией с вами.
Особенности функции
-
Отображается полная цепочка ссылок до текущей страницы. Например, если текущая страница находится в рубрике второго уровня, то цепочка будет выглядеть следующим образом:
Главная » Рубрика » Подрубрика » Название статьи
Во всех решениях, которые я встречал (за исключением плагинов), такая цепочка выглядела вот так:
Главная » Подрубрика » Название статьи
Т.е. одно звено потеряно.
Аналогично у меня выглядят и “крошки” для страниц. К примеру, для страницы 3-го уровня вложенности цепочка будет такой:
Главная » Страница 1-го уровня » Страница 2-го уровня » Страница 3-го уровня
-
“Хлебные крошки” выводятся для следующих типов страниц WordPress-сайта:
- постраничная навигация с главной страницы (вида site.ru/page/2/);
- архив рубрики;
- архив тега;
- архив за день;
- архив за месяц;
- архив за год;
- архив автора;
- страница;
- пост;
- результаты поиска;
- страница с ошибкой 404.
- Добавляется порядковый номер страницы, если это 2-я или больше страница архивов.
- Можно задать любой символ разделителя между ссылками.
- Можно задать текст для ссылка “Главная”.
- Используется отдельный CSS-класс для текущей позиции.
Функция “Хлебные крошки” для WordPress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | function dimox_breadcrumbs() { $delimiter = '»'; //разделить между ссылками $name = 'Главная'; //текст ссылка "Главная" $currentBefore = '<span class="current">'; $currentAfter = '</span>'; if ( !is_home() && !is_front_page() || is_paged() ) { echo '<div id="crumbs">'; global $post; $home = get_bloginfo('url'); echo '<a href="' . $home . '">' . $name . '</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 $currentBefore . 'Archive by category ''; single_cat_title(); echo ''' . $currentAfter; } 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 $currentBefore . get_the_time('d') . $currentAfter; } elseif ( is_month() ) { echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' '; echo $currentBefore . get_the_time('F') . $currentAfter; } elseif ( is_year() ) { echo $currentBefore . get_the_time('Y') . $currentAfter; } elseif ( is_single() ) { $cat = get_the_category(); $cat = $cat[0]; echo get_category_parents($cat, TRUE, ' ' . $delimiter . ' '); echo $currentBefore; the_title(); echo $currentAfter; } elseif ( is_page() && !$post->post_parent ) { echo $currentBefore; the_title(); echo $currentAfter; } 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); foreach ($breadcrumbs as $crumb) echo $crumb . ' ' . $delimiter . ' '; echo $currentBefore; the_title(); echo $currentAfter; } elseif ( is_search() ) { echo $currentBefore . 'Search results for '' . get_search_query() . ''' . $currentAfter; } elseif ( is_tag() ) { echo $currentBefore . 'Posts tagged ''; single_tag_title(); echo ''' . $currentAfter; } elseif ( is_author() ) { global $author; $userdata = get_userdata($author); echo $currentBefore . 'Articles posted by ' . $userdata->display_name . $currentAfter; } elseif ( is_404() ) { echo $currentBefore . 'Error 404' . $currentAfter; } if ( get_query_var('paged') ) { 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 '</div>'; } } |
Функцию необходимо поместить в файл functions.php вашей WordPress-темы. После этого в то место шаблона, где хотите выводить “хлебные крошки”, добавьте следующий код:
1 | <?php if (function_exists('dimox_breadcrumbs')) dimox_breadcrumbs(); ?> |
Единственное, что теперь останется сделать - оформить их с помощью CSS. Для этого к блоку “хлебных крошек” предусмотрен идентификатор #crumbs, а для текущей “крошки” класс .current.
P.S. Функция работает на WordPress, начиная с версии 2.5 и выше.
P.P.S. Если вы публикуете посты сразу в несколько рубрик, то в цепочке будут отображаться все эти рубрики через запятую. Я посты публикую всегда только в одну рубрику, поэтому не пытался сделать так, чтобы отображалась только одна из рубрик.
Достаточно полезная функция. Взял на заметку. Иногда полезно видеть весь путь к статье, юзабилити повышает как никак :)
Димк, а можно скрин или ссылку на пример? А то я что-то не воспринял на слух что и где будет выводится и как оно вообще выглядит.
Не знал что это называется хлебные крошки=) Фишка такая я думаю мне не нужна, но вот ссылочка на php-хаки для wp вкусная=)))
Спасибо, попробую. Обычно для своих проектов я выводил их через
, а потом css прикручивал. Получается, что практическая разница только в длине ссылочного пути? Что-то еще от этого выигрываем по сравнению со стандартным вариантом?
Я же в статье привел несколько примеров. Погугли по запросу “breadcrumbs examples”.
wp_tag_cloud - это облако тегов, а “хлебные крошки” - это совсем другое.
ссылка на википедию не работает
Исправил.
Аааа… Понял о чем речь, спасибо за ликбез =)
Я так понимаю, для постов с несколькими рубриками эта функция будет работать некорректно? и будет ли работать вообще?
Будет работать, конечно, но выглядеть это будет некрасиво, например:
Главная » Рубрика 1, Рубрика 2, Рубрика 3 » Название статьи
2 недели назад ломал голву над тем, как сделать это без плагина, в итоге сдался и поставил плагин)
Я и сам собирался тока плагин качать, а теперь можно и без него обойтись! Пасибо
Интересно, взял пост на заметку. У меня вопрос: стоит ли категории и подкатегории заключать в noindex? Не будут ли эти страницы считаться дублированным контентом?
Я на своем блоге тоже написал подобную статью. Делал перевод одного зарубежного ресурса. Там для хлебных крошек используется такой код:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$theFullUrl = $_SERVER["REQUEST_URI"];
$urlArray=explode("/",$theFullUrl);
echo ‘You Are Here: <a href="/">Home</a>’;
while (list($j,$text) = each($urlArray)) {
$dir=";
if ($j > 1) {
$i=1;
while ($i < $j) {
$dir .= ‘/’ . $urlArray[$i];
$text = $urlArray[$i];
$i++;
}
if($j < count($urlArray)-1) echo ‘ » <a href="’.$dir.‘">’.
str_replace("-", " ", $text) . ‘</a>’;
}
}
echo wp_title();
}
breadcrumbs();
?>
Однако у меня не вышло. Буду пробовать Ваш метод ))
Информация интересная, я честно говоря не знал об этой функции. Правда, пока мои сайты простые как веник и им такая фуккция не нужна. Но в будущем надеюсь использовать.
Обидно, что подходит только для WordPress версии 2.5 и выше. Меня и старая версия устраивала, но от хлебных крошек я бы не отказалась. Наверное, придется устанавливать новую версию, но я к своей старушке уже так привыкла…
Спасибо. Очень интересная информация
Да, так однозначно криво выводится, а поэтому либо вообще их не использовать что не совсем правильное решение, либо использовать только одну рубрику для сообщения.
Но вот что! Мб можно подкоректировать функцию и для постов, которые находятся в нескольких рубриках выводить только одну рубрику?
Полезно, но
на самом деле отображается не цепочка ссылок( как я добрался до статьи), а ссылки на “развернутые” рубрики где находиться статья, ИМХО это не одно и тоже
Супер! Очень полезная и необходимая вещь.
А если представить что я до статьи добирался “через тернии”? Нужно ли вообще видеть всю цепочку ссылок? Правильным считаю отображать
Спасибо большое за этот пост. Давным давно искал способ реализовать описанную функцию, но не мог сформулировать ее четко, поэтому ничего путнего не находил. Временами забывал о ней, потом снова вспоминал и опять ничего не находил. А тут вот в ридере как чудесный подарок ваша статейка. Ок. Будем устанавливать. Благодарствую.
Пожалуйста =) Рад, что пригодилось.
Сколько запросов к БД делает плагин?
Ни одного.
сорри за оффтоп: я думаю, почему ты не пишешь ничего, а у тебя оказывается RSS нерабочий через фидбёрнер http://feeds.feedburner.com/SupraBlog.
Полезная вещь действительно очень. Может быть в виде плагина оформите?
Адрес еще год назад изменился - http://dimox.name/izmenilsya-adres-rss-fida-bloga-dimoxname/
А смысл?
Смысл в том, что делать ничего не надо будет) Просто установил плагин и все. А в коде я не разбираюсь, поэтому сделать не смогу. А плагин установить - легко.
Чтобы не таскать код из шаблона в шаблон, это не трудно. Но иногда надоедает. Да и у новичков с правкой function.php может быть затруднительно.
Анна Светикова, таже самая ситуация. Эхъ, придется идти в ногу со временем, что поделать.
Спасибо за полезную функцию. Буду обновлять версию.
Я подобным не пользуюсь, для меня WP - это способ выражать мысли.
Если я что либо меняю в functions.php, я должен заново активировать тему, чтоб изменения увидеть или она автоматом “примутся” (как если изменять index.php).
к примеру: убираю регистрацию 3х сайдбаров, обновляю страницу их все равно 4,
и добавленные функции тоже не работают.
Прощу прощения если оффтоп, только начал разбираться с WP, но тут Вы тоже вносите изменения в functions.php
тоже предпочитаю пользоваться плагинами. Ведь они для этого и созданы. Хотя если есть пошаговый алгоритм действий могу и в код залезть. А на простых блогах обязательно применять хлебные крошки? Юзабилити конечно нужно совершенствовать. Но этому нужно учиться.
Изменения вступают автоматически, заново активировать не надо.
Очень нравятся именно Ваши “хлебные крошки” .
Попыталась поставить на свой блог - что-то не получилось.
Скажите, пожалуйста, для “чайников”:
- это понятно.
Хочется, чтобы крошки отображались под заголовком поста - попыталась добавить в PAGE.php, но в какую его часть? - я “повозила” этот код по всему файлу )))), но результатов не добилась. Что не так?
поставила в конец CSS (правильно?)
/* хлебные крошки */
#crumbs
.current {font-size:12px;
}
Заранее спасибо :-)
полезная вещь Dimox …спасибо!
Шаблоны постов находится в файлах archive.php, home.php, index.php, search.php и single.php (если такие есть в папке с темой), вот туда и нужно вставлять код.
Правильно.
Полезная штука.. поставил себе на новенький блог :) но как сделать чтобы на главной выводился URL главной с тайтлом?
Дабавил в закладки
ПО мере наполнения блога думаю понадобятся эти “хлебные крошки”
А вы применяете это в своем блоге?
Я применяю, автор на данном блоге нет.
пипец! два дня ковырялся с плагинами, которые вместо русских названий рубрик выводят slug, пытался сам стандартными путями сделать breadcrumbs, а оказывается этот пост у меня в закладках был! (:
но пришел я с гугла, причем английская версия выше в результатах
но сейчас обнаружился баг, который у меня уже был на моем способе:
на single до вывода поста у меня подключается слайдшоу с постами из другой категории. и в итоге в crumbs показываетэту категорию и заголовок какого-то поста из этой категории. возможно просто надо поменять названия переменных в работе слайдшоу, пойду попробую
с ходу не вышло, может кто поможет?
$smoothgallery_posts->the_post(); переписывает переменную $post, а затем следует вызов dimox_breadcrumbs() и в ней get_the_category() выдает левые категории для поста из слайдшоу. при этом функции типа single_post_title() и после слайдшоу выдают нормальные данные поста. вот как бы перед функцией крошек сделать так, что бы get_the_category() поймал правильные категории?
Попробуй перед кодом вывода хлебных крошек вставить это:
Если не поможет, то, к сожалению, больше ничем помочь не могу.
а ведь помогло! спасибо. буду значит, что такая штука есть и как работает
Отлично. Рад, что сработало.
Дим, как на главной вывести линк на главную в крошках?
Хм… “Хлебные крошки”… - никогда не слышал… попробую реализовать…
Перед строкой:
добавь:
2
3
echo '<div id="crumbs"><a href="ССЫЛКА_НА_ГЛАВНУЮ">Home</a></div>';
}
Спасибо, работает..
Да полезная функция.
Таки не удержался, сделал себе крошки эти.
Спасибо, Дим, - работает здорово, выглядит вроде тоже симпатично.
Знать бы еще насколько оно полезно с точки зрения seo.
Спасибо, замечательное решение. Спасибо Вам!
Крошки не работают на WP 2.9.2. Ругается на /wp-includes/pluggable.php on line 868 :(
У меня работает без ошибок. Возможно, что функция конфликтует с каким-то плагином, который у вас установлен.
Странно, потому что на идентичной версии сайта с таким же набором плагинов всё работает, но там версия wp 2.9.1
В общем ситуация такая в версиях wp 2.9.2 - 2.9.1 имеем проблему с админкой, при попытке что-то изменить в админке (сохранить запись или добавить рубрику и т.п.) видим белый лист. После того как убираем код крошек из functions.php, проблема исчезает.
Извините, что я вас тут заспамила) лишний <?php был в functions.php. Спасибо за крошки ещё раз :)
Ну вот, хорошо, что разобрались. Пожалуйста.
Спасибо за решение. Но к сожалению, с Вашими крошками не работает плагин PageNavi, и даже рукописная постраничная навигация. Очень жаль.
скажите, а как изменить язык в крошках, когда выводится номер страницы. Сейчас он пишет “… (Страница 2)”. Хочется, чтобы вместо Страница 2 было Page 2. Где это изменить, скажите, пожалуйста.
Я у себя такой проблемы не наблюдаю.
В функции замените __(’Page’) на ‘Page’.
Кавычки в обоих случаях прямые, это WordPress их так переделывает.
Благодарю Вас!
К сожалению, когда попробовала скопировать в functions.php код функции, слетела кодировка у всего блога, хотя сохраняла в utf8 и без BOM…
Спасиба! Очень замечательная весчь!!! =)
вопросик есь… а как поменять CSS таким образом чтоб например активная ссылка (т.е. где сейчас находится пользователь) отличалась цветом от неактивной? =)
заранее благодарен… Наверн тупой вопрос счас задал)))
Для текущего пункта предусмотрен класс .current, т.е. использовать вот так:
Скажите, пожалуйста, а почему лучше обходиться без плагинов?
Потому что они могут создавать лишнюю и неоправданную нагрузку на сайт. Вообще-то я об этом уже написал в статье.
Ой… извините )) спасибо за ответ )
Спасибо за статью
цикл foreach можно заменить на implode с указанием сепаратора.
Спасибо Вам за информацию. Будем “уделять” внимание на численность плагинов.
Странно но функцию поместить в файл functions.php не удается ((( Может в ней что-то изменить надо?
Что значит “не удается”?
Выдавало ошибку. Извините, не помню какую. ((( Сделал немного по другому, без использования файла functions.php
2
3
4
5
6
7
<a href="<?php bloginfo('home'); ?>/">Главная</a>
»
<?php the_category( ' , ' ) ?>
»
<strong><?php the_title(); ?></strong>
<?php } ?>
Выглядит вроде не плохо. И работает. )))