Хлебные крошки для WordPress без плагина (поддержка пользовательских типов записей и таксономий)

Posted by

Для тех кто слышит это словосочетание –  «хлебные крошки» первый раз привожу цитату из Википедии:

Навигационная цепочка (дублирующее меню, «хлебные крошки», англ. Breadcrumbs) — элемент навигации (обычно в файловых менеджерах), представляющий собой путь по файловой системе откорня до рабочего каталога, который в данный момент просматривает пользователь.

Название «хлебные крошки» является иронической отсылкой к немецкой сказке «Гензель и Гретель», в которой дети, когда их завели в лес во второй раз, не смогли найти обратную дорогу, так как на этот раз вместо маленьких камешков они оставляли за собой хлебные крошки, впоследствии склёванные лесными птицами.

Как то недавно возникла необходимость вставить хлебные крошки с уникальными требованиями заказчика на сайт. Прежде, я поступал другим образом: мучил парочку плагинов, чтобы добиться желаемого результата. Вот решил создать так называемые “хлебные крошки” собственного производства. Они работают в рубриках и на отдельных страницах типа “запись” и “страница”. В скором будущем если возникнет необходимость создам для других типов страниц и записей. Пока необходимости такой нет.

Выглядят мои хлебные крошки следующим образом:

breadcrubms

 

Для стилизации разделителей между элементами использовал псевдо-элемент :before который присваивал элементам списка, а также иконки из fontawesome.

В чём преимущество вставки “хлебных крошек” без плагина:

  • Немного разгружаете сервер
  • Можете вручную редактировать некоторые параметры, которые отредактировать в плагинах не получается.
  • Вы можете полностью переделать функцию по своему усмотрению взяв основной принцип.
/**
 * Функция хлебных крошек. Работает в пользовательских таксономиях и типах постов, имеет микроразметку. Локализировано.
 * @param  string $razdelitel разделитель между ссылками
 * @return выводит html разметку хлебных крошек
 */
function custom_breadcrumb($home_text='Home'){

//получаем textdomain темы для локализации
	$curent_theme = wp_get_theme();
	$textdomain=$curent_theme->get('TextDomain');

  // Категории
	if (is_category() ) {
		echo "<li><a href=\"".home_url()."\" title=\"".__($home_text,$textdomain)."\">".__($home_text,$textdomain)."</a></li>";
		
		$ancestors = get_ancestors( get_query_var('cat'), 'category' );
		if ($ancestors) {
			foreach ($ancestors as $ancestor) {
				echo "<li itemscope=\"\" itemENGINE=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"".get_category_link($ancestor)."\" title=\"".get_cat_name($ancestor)."\" itemprop=\"url\"><span itemprop=\"title\"> ".get_cat_name($ancestor)."</span></a></li>";
				
			}
		}
		echo "<li class=\"active\">".single_cat_title('',0)."</li>";
    //Архивы
	}elseif (is_archive()) {
		echo "<li><a href=\"".home_url()."\" title=\"".__($home_text,$textdomain)."\">".__($home_text,$textdomain)."</a></li>";
		
		$queried_object = get_queried_object();
		$ancestors = get_ancestors( $queried_object->term_id, $queried_object->taxonomy );
		if ($ancestors) {
			foreach ($ancestors as $ancestor) {
				echo "<li itemscope=\"\" itemtype=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"".get_term_link($ancestor)."\" title=\"".get_cat_name($ancestor)."\" itemprop=\"url\"> <span itemprop=\"title\" itemprop=\"url\"><span itemprop=\"title\">".get_cat_name($ancestor)."</span></a></li>";
				
			}
		}
		echo "<li class=\"active\">".single_cat_title('',0)."</li>";
	}elseif (is_single()) {
		global $post;
		$obj = get_post_type_object(get_post_type());
		if (get_post_type()=='post') {
			$taxonomy='category';
		}else{
			$taxonomy=$obj->taxonomies[0];
		}
		$term= get_the_terms($post->ID,$taxonomy); 

		$term_curent=$term[0]->term_id;
		$term_name=$term[0]->name;
		echo "<li><a href=\"".home_url()."\" title=\"".__($home_text,$textdomain)."\">".__($home_text,$textdomain)."</a></li>";
		
		$ancestors = get_ancestors($term_curent,$taxonomy);
		if ($ancestors) {
			foreach ($ancestors as $ancestor) {
				echo "<li itemscope=\"\" itemtype=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"".get_term_link($ancestor)."\" title=\"".get_cat_name($ancestor)."\" itemprop=\"url\"> <span itemprop=\"title\">".get_cat_name($ancestor)."</span></a></li>";
				
			}
		}
		echo "<li itemscope=\"\" itemtype=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"".get_term_link($term_curent,$taxonomy)."\" title=\"".$term_name."\" itemprop=\"url\"><span itemprop=\"title\">".$term_name."</span></a></li>";
		
		echo "<li class=\"active\">".get_the_title()."</li>";

    //Страницы
	}elseif (is_page()) {
		echo "<li><a href=\"".home_url()."\" title=\"".__($home_text,$textdomain)."\">".__($home_text,$textdomain)."</a></li>";
		
		$ancestors = get_ancestors( get_the_id(), 'page' );
		if ($ancestors) {
			foreach ($ancestors as $ancestor) {
				echo "<li itemscope=\"\" itemtype=\"http://data-vocabulary.org/Breadcrumb\"><a href=\"".get_the_permalink($ancestor)."\" title=\"".get_the_title($ancestor)."\" itemprop=\"url\"><span itemprop=\"title\">".get_the_title($ancestor)."</span></a></li>";
				
			}
		}
		echo "<li class=\"active\">".get_the_title()."</li>";
	}
}

Вставить эту функцию в шаблон можно следующим образом:

<ol class="breadcrumb">
  <?php if(function_exists('custom_breadcrumb')) custom_breadcrumb('/'); ?>
</ol>

Обновлено 15.05.2016 (теперь работает в пользовательских типах записей и таксономиях).

Обновлено 16.05.2016 (добавлена микро-разметка и локализация)

Поделиться:
Підписатися

Сповістити про





0 Ваш коментар

Вбудовані Відгуки
Переглянути всі коментарі