WordPress как на ладони

Kama Breadcrumbs

Плагин создает цепочку ссылок от главной до текущей просматриваемой страницы. Такую цепочку принято называть «хлебные крошки».

Это новая версия — более простой, стабильный, расширяемый и понятный код. Измененная система хуков. Дополнительный функционал. Прошлый код значительно доработан.

Плагин содержит отдельный класс, который можно «забрать» из плагина и встроить в тему или другой плагин. Однако, если вы делаете плагин или тему на продажу, то вам нужно будет приобрести лицензию разработчика (Dev лицензию).

Использование

Используйте следующий код в файле темы, там где нужно вывести крошки:

<?php echo kama_breadcrumbs(); ?>

Также можно передать параметры:

<?php echo kama_breadcrumbs( $args, $l10n ); ?>
$args(мпссив)

Параметры крошек. Все параметры по умолчанию:

// Параметры по умолчанию
$args = array(

	'sep'             => ' » ', // разделитель. Можно указать вместе с HTML оберткой: <span> > </span>
	'on_front_page'   => true,  // выводить крошки на главной странице
	'show_post_title' => true,  // показывать ли название записи в конце (последний элемент). Для записей, страниц, вложений
	'show_term_title' => true,  // показывать ли название элемента таксономии в конце (последний элемент). Для меток, рубрик и других такс

	'last_sep'        => true,  // показывать последний разделитель, когда заголовок в конце не отображается
	'nofollow'        => false, // добавлять rel=nofollow к ссылкам?

	'priority_tax'    => array(),
						 // с версии 4.7. приоритетные таксономии, нужно когда запись в нескольких таксах: array( 'category', 'tax_name' ).
						 // Порядок имеет значение: чем раньше тем важнее.
						 // В значениях можно указать приоритетные термины, тогда название таксономии нужно указывать в ключе.
						 // когда запись находится в нескольких элементах одной таксы одновременно.
						 // Например: array( 'category'=>array(45,'term_name','имя терма'), 'tax_name'=>array(1,2,'name') )
						 // 'category' - такса для которой указываются приор. элементы: 45 - ID термина, 'term_name' - ярлык или 'имя терма' - заголовок.
						 // порядок 45, 'term_name' и 'имя терма' имеет значение: чем раньше тем важнее. Все указанные термины важнее неуказанных...

	'disable_tax'     => array(), // таксономии которые нужно исключить из показа в крошках: array('post_tag', 'tax_name')
	'number_tax'      => array(), // позволяет выводить в крошках для записей сразу несколько таксономий.
								  // Пример: array('post'=>2) - для типа записи post выведет крошки для двух таксономий (по умолчанию: category и post_tag).
								  // Поменять порядок также можно в параметре 'priority_tax'.

	'markup'          => 'Microdata',
						 // 'markup' - микроразметка. Может быть: 'Microdata', 'RDFa', '' - без микроразметки
						 // или можно указать свой массив разметки:
						 // array(
						 //     'wrappatt'  => '<div class="kama_breadcrumbs">%s</div>',
						 //     'linkpatt'  => '<a href="%s">%s</a>',
						 //     'titlepatt' => '<span class="kb_title">%s</span>',
						 //     'seppatt'   => '<span class="kb_sep">%s</span>'
						 // )
	'wrap_class'      => 'kama_breadcrumbs', // css класс для главного div
	'title_class'     => 'kb_title',         // css класс заголовка элемента
	'sep_class'       => 'kb_sep',           // css класс разделителя

);
$l10n(массив)

Параметры локализации. Строки переводятся на англ. если у сайта выбран англ. язык. По умолчанию:

// Локализация
$l10n = array(
	'home'       => 'Главная',
	'paged'      => 'Страница %d',
	'_404'       => 'Ошибка 404',
	'search'     => 'Результаты поиска по запросу - <b>%s</b>',
	'author'     => 'Архив автора: <b>%s</b>',
	'year'       => 'Архив за <b>%d</b> год',
	'month'      => 'Архив за: <b>%s</b>',
	'day'        => 'Архив за <b>%1$s число</b>, %2$s', // Архив за 5 число, среда
	'attachment' => 'Медиа: %s',
	'tag'        => 'Записи по метке: <b>%s</b>',
	'tax_tag'    => '%1$s из "%2$s" по тегу: <b>%3$s</b>',
	// tax_tag выведет: 'тип_записи из "название_таксы" по тегу: имя_термина'.
	// Если нужны отдельные холдеры, например только имя термина, пишем так: 'записи по тегу: %3$s'
);
меню

Фильтры (хуки)

// фильтрует строки локализации - $l10n - это массив
$l10n = apply_filters( 'kama_breadcrumbs_l10n', $l10n );

// фильтрует параметры - $args - это массив
$args = apply_filters( 'kama_breadcrumbs_args', $args );

// вывод: все виды записей с терминами, или термины
$term = apply_filters( 'kama_breadcrumbs_term', $term );

// возможность изменить элементы крошек
$elms = apply_filters_ref_array( 'kama_breadcrumbs_filter_elements', array( $elms, &$this, $ptype ) );

// возможность изменить элементы крошек, 
// после того, как все элементы были собраны в одномерный (плоский) массив
$flat_elms = apply_filters_ref_array( 'kama_breadcrumbs_filter_flat_elements', array( $flat_elms, &$this, $ptype ) );

// фильтрует готовый HTML код крошек
return apply_filters( 'kama_breadcrumbs', sprintf( $arg->wrappatt, $out ), $arg->sep, $loc, $arg );
меню

Примеры использования фильтров

Изменение параметров по умолчанию

// установим параметры по умолчанию
add_filter( 'kama_breadcrumbs_args', function($args){
	return [
		'sep'             => ' › ', // ▸
		'on_front_page'   => 1,
		'show_post_title' => 0,
		//'show_term_title' => 0,
		//'last_sep'      => 0,
		'markup'          =>'RDFa',
		// или своя маркировка
		'markup' => [
			'wrappatt'  => '<div class="kama_breadcrumbs">%s</div>',
			'linkpatt'  => '<li><a href="%s">%s</a></li>',
			'titlepatt' => '<li class="active">%s</li>',
			'seppatt'   => '<span class="kb_sep">%s</span>',
		],
		'priority_tax' => [ 'category', 'tplcat', 'wpfunccat' ],
	]
	+ $args;
} );

Локализация (строки перевода)

// изменим строки перевода
add_filter( 'kama_breadcrumbs_l10n', function($l10n){
	return [
		'home'    => '<i style="display:none;">Главная</i><span class="dashicons dashicons-admin-home"></span>',
		'tax_tag' => 'По метке: <b>%3$s</b>',
	]
	+ $l10n;
} );

Добавление своих элементов в крошки

#1 Просто пример

// добавить свои ссылки в крошки - добавим рубрику funccat, если запись (функция) из этой рубрики.
add_filter( 'kama_breadcrumbs_filter_elements', 'breadcrumbs_add_tplcat', 10, 3 );
function breadcrumbs_add_tplcat( $elms, $class, $ptype ){
	global $post;

	// дебаг - смотрим какие элементы есть в массиве и добавляем куда и что нужно
	// print_r( $elms ); 

	if( is_single() && $terms = get_the_terms($post->ID, 'funccat') ){
		// добавим 2 ссылки (2 элемента) после главной
		$elms['home_after'][] = [
			$class->makelink('/functions', 'Функции' ),
			$class->makelink('/functions/template_tags', 'Теги шаблона' )
		];
	}

	return $elms;
}

#2 Пример для woocommerce

add_filter( 'kama_breadcrumbs_filter_elements', 'kama_breadcrumbs_add_elements', 10, 3 );
function kama_breadcrumbs_add_elements( $elms, $class, $ptype ){

	if ( is_woocommerce() ) {
		if ( is_shop() && ! is_paged() ) {
			$elms['home_after'] = $class->maketitle( get_the_title( wc_get_page_id( 'shop' ) ), get_the_permalink( wc_get_page_id( 'shop' ) ) );
		}
		else {
			$elms['home_after'] = $class->makelink( get_permalink( wc_get_page_id( 'shop' ) ), get_the_title( wc_get_page_id( 'shop' ) ) );
		}
	}

	return $elms;
}

Массив $elms выглядит примерно так (отличается на разных страницах сайта):

Array(

	[home] =>   <span property="itemListElement" typeof="ListItem">
					<a href="http://example.com" property="item" typeof="WebPage"><span property="name"><i style="display:none;">Главная</i><span class="dashicons dashicons-admin-home"></span></span></a>
					<meta property="position" content="ORDERNUM" />
				</span>

	[home_after] => Array(
			[0] =>  <span property="itemListElement" typeof="ListItem">
						<a href="/functions" property="item" typeof="WebPage"><span property="name">Функции</span></a>
						<meta property="position" content="ORDERNUM" />
					</span>
			[1] =>  <span property="itemListElement" typeof="ListItem">
						<a href="/functions/template_tags" property="item" typeof="WebPage"><span property="name">Теги шаблона</span></a>
						<meta property="position" content="ORDERNUM" />
					</span>
	)

	[single] => Array(
			[wpfunccat__tax_crumbs] => Array(
					[0] =>  <span property="itemListElement" typeof="ListItem">
								<a href="http://example.com/function-cat/miscellaneous" property="item" typeof="WebPage"><span property="name">Прочие функции</span></a>
								<meta property="position" content="ORDERNUM" />
							</span>
					[1] =>  <span property="itemListElement" typeof="ListItem">
								<a href="http://example.com/function-cat/zaschita-bloga" property="item" typeof="WebPage"><span property="name">Защита</span></a>
								<meta property="position" content="ORDERNUM" />
							</span>
			)

			[title] =>  <span class="kb_title" property="itemListElement" typeof="ListItem">
								<span property="name">form_option</span>
								<meta property="position" content="ORDERNUM">
							</span>
	)

)

В него можно добавлять любые свои элементы и каждый элемент может быть как строкой так и массивом с другими элементами. В результате все эти элементы будут последовательно собраны и выведены в крошках по порядку.

HTML код ссылки с schema.org разметкой создается через метод

$class->makelink( $url, $title )  // для элементов крошек
$class->maketitle( $title, $url ) // для последнего элемента крошек

Названия ключей массива $elms, например, home_after, нужны, чтобы проще было «сунуть» свою ссылку в нужное место крошек.

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

$elms['home_after'][] = $class->makelink('http://example.com/functions', 'Функции' );

// или так, сразу несколько ссылок:
$elms['home_after'][] = [
	$class->makelink('http://example.com/functions', 'Функции' ),
	$class->makelink('http://example.com/hooks', 'Хуки' ),
];

// или заменим на свои ссылки (удалим текущее значение home_after)
// добавим сразу несколько ссылок, с заменой текущей крошки:
$elms['home_after'] = [
	$class->makelink('http://example.com/functions', 'Функции' ),
	$class->makelink('http://example.com/hooks', 'Хуки' ),
];
меню

Изменение классов под БЭМ верстку

## параметры по умолчанию — kama_breadcrumbs
add_filter( 'kama_breadcrumbs_args', function($args){

	$wrap_class = 'breadcrumbs';

	if( is_page() )
		$modifier = 'box';
	else
		$modifier = '';

	return array_merge( $args, array(

		'sep_class' => 'breadcrumbs__sep',

		// своя маркировка
		'markup' => [

			'wrappatt'  => '
				<div class="'. $wrap_class .' '. ( $modifier ? "$wrap_class--$modifier" : '' ).'" itemscope itemtype="http://schema.org/BreadcrumbList">
					<div class="'. "{$wrap_class}__inner" . ( $modifier ? " {$wrap_class}__inner--$modifier" : '' ) .'">%s</div>
				</div>',

			'linkpatt'  => '
				<span class="'. "{$wrap_class}__item" .'" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
					<a href="%s" class="'. "{$wrap_class}__link " . ( $modifier ? "{$wrap_class}__link--$modifier" : '' ) .'" itemprop="item"><span itemprop="name">%s</span></a>
					<meta itemprop="position" content="ORDERNUM" />
				</span>',

			'titlepatt' => '                
				<span class="'. "{$wrap_class}__title" .'" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
					<span itemprop="name">%s</span>
					<meta itemprop="item" content="PERMALINK" />
					<meta itemprop="position" content="ORDERNUM" />
				</span>
			',
		],
	) );
} );
Еще примеры

Смотрите в вопросе.

23 коммента
Полезные 1 Все
  • @ Ильяс Фаизов cайт: ifaizov.com

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

    Ответить4 мес назад #
  • Александр

    Добрый день, скажите как исправить ошибку в валидаторе гугла, просит item для последнего элемента, хотя он и не является ссылкой

    Ответить4 мес назад #
    • Kama7482

      Скиньте плиз HTML код крошек, который при этом получается. Не могу смоделировать что-то...

      Ответить4 мес назад #
    • Kama7482

      Поправил! Версия 4.7.7

      Ответить4 мес назад #
  • @ Tmks1

    Здравствуйте,
    добавил плагин на тестовый сайт, заметил что при выводе записи типа Архив, не показывает месяц в последнем элементе (скрин). Может я что пропустил в настройках?
    Версия плагина 4.8.0

    1
    Ответитьмесяц назад #
    • Kama7482

      В строке перевода было %d вместо %s. Поправил - версия 4.8.1 thank_you

      Ответитьмесяц назад #
  • Здравствуйте.
    Есть такая проблема с отображением крошек.
    Создал новый пользовательский тип записи

    name: business
    label: Услуги юридическим лицам
    singular_label: Услуга юридическим лицам
    description: ""
    public: true
    publicly_queryable: true
    show_ui: true
    show_in_nav_menus: true
    show_in_rest: true
    rest_base: ""
    rest_controller_class: ""
    has_archive: false
    has_archive_string: ""
    exclude_from_search: false
    capability_type: post
    hierarchical: true
    rewrite: true
    rewrite_slug: ""
    rewrite_withfront: true
    query_var: true
    query_var_slug: ""
    menu_position: ""
    show_in_menu: true
    show_in_menu_string: ""
    menu_icon: ""
    custom_supports: ""

    В ней создаю страницы с различными услугами. И когда вставляю код хлебных крошек, то на странице услуги я вижу такое отображение: sitename / usluga1, то есть не показывается между ними "business".
    Если указать has_archive: true, тогда все показывается как нужно, но мне нужно чтобы было именно has_archive: false, чтобы я мог редактировать главную страницу данной CPT через админку.

    Ответить17 дней назад #
    • Kama7482

      Это нестандартное поведение, поэтому лучше всего думаю добавить фильтр куда-нибудь в functions.php:

      // Добавим дополнительные элементы хлебных крошек
      add_filter( 'kama_breadcrumbs_filter_elements', function( $elms, $class ){
      
      	// если это запись business
      	if( is_singular( 'business' ) ){
      		$page = get_post( 321 ); // страница созданная для замены архива типа записи
      
      		$elms['home_after'][] = $class->makelink( get_permalink($page), $page->post_title );
      	}
      
      	return $elms;
      }, 10, 2 );
      

      321 замени на ID своей постоянной страницы, которая создана для вывода архива типа записи.

      Этот код добавляет дополнительный элемент в хлебные крошки, сразу после первого элемента (home).

      Ответить15 дней назад #
      • Добавил, имя записи ('business') тоже, но, увы, ничего не поменялось
        Сами крошки вывожу через код по-умолчанию <?php echo kama_breadcrumbs(); ?>
        Пробовал менять и в 'my_post_type_name', и в 'Имя типа записи'

        Ответить15 дней назад #
        • Kama7482

          Ааа, для страницы архива используется произвольная страница? Тупанул чет, хотя у меня на этом сайте тоже так сделано для некоторых типов записей.

          Тебе нужно просто поменять проверку в коде, с is_post_type_archive( $post_type ) на is_page( 'business' ) или какой там у страницы ярлык (post_name).

          П.С. подправил предложенный код выше.

          Ответить13 дней назад #
          • Спасибо за ответ, но снова что-то не то sad
            На самой произвольной странице (page-business.php), которая используется для страницы архива выдает следующую ошибку

            Fatal error: Uncaught Error: Call to a member function makelink() on null in D:\OSPanel\domains\demin\wp-content\themes\demin\functions.php:232 Stack trace: #0 D:\OSPanel\domains\demin\wp-includes\class-wp-hook.php(288): {closure}(Array) #1 D:\OSPanel\domains\demin\wp-includes\plugin.php(251): WP_Hook->apply_filters(Array, Array) #2 D:\OSPanel\domains\demin\wp-content\plugins\kama-breadcrumbs\kama-breadcrumbs.php(514): apply_filters_ref_array('kama_breadcrumb...', Array) #3 D:\OSPanel\domains\demin\wp-content\plugins\kama-breadcrumbs\kama-breadcrumbs.php(34): Kama_Breadcrumbs->get_crumbs(Array, Array) #4 D:\OSPanel\domains\demin\wp-content\themes\demin\page-business.php(9): kama_breadcrumbs() #5 D:\OSPanel\domains\demin\wp-includes\template-loader.php(78): include('D:\\OSPanel\\doma...') #6 D:\OSPanel\domains\demin\wp-blog-header.php(19): require_once('D:\\OSPanel\\doma...') #7 D:\OSPanel\domains\demin\index.php(17): require('D:\\OSPanel\\doma...') #8 {main} thrown in D:\OSPanel\domains\demin\wp-content\themes\demin\functions.php on line 232
            

            А на внутренней странице /business/kuplya-prodazha-postavka/ как ничего и поменялось Главная » Купля-продажа, поставка

            Ответить13 дней назад #
            • Kama7482

              Пардон параметр в хук не передал smile Поправил код выше...

              Ответить13 дней назад #
              • Тестирую
                На странице архива в крошках следующее:

                Главная (ссылка на главную) » Услуги юридическим лицам (ссылка на текущую страницу) » Услуги юридическим лицам (не ссылка)

                На внутренней странице Главная (ссылка на главную) » Купля-продажа, поставка (не ссылка)

                Ответить13 дней назад #
                • Kama7482

                  Еще изменил код... Надо же на страницах типа записи выводить ссылку на доп страницу...

                  321 замени на ID своей постоянной страницы, которая создана для вывода архива типа записи.

                  Ответить13 дней назад #
                  • Пробую.
                    На родительской странице стало все ок
                    На внутренней: Главная » » Купля-продажа, поставка
                    Весь код:

                    <div class="kama_breadcrumbs" itemscope="" itemtype="http://schema.org/BreadcrumbList">
                    	<span itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
                    		<a href="http://demin" itemprop="item"><span itemprop="name">Главная</span></a>
                    		<meta itemprop="position" content="1">
                    	</span><span class="kb_sep"> » </span>
                    	<span itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
                    		<a href="http://demin/business/kuplya-prodazha-postavka/" itemprop="item"><span itemprop="name"></span></a>
                    		<meta itemprop="position" content="2">
                    	</span><span class="kb_sep"> » </span>
                    	<span class="kb_title" itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
                    		<span itemprop="name">Купля-продажа, поставка</span>
                    		<meta itemprop="item" content="http://demin/business/kuplya-prodazha-postavka/">
                    		<meta itemprop="position" content="3">
                    	</span>
                    </div>
                    Ответить13 дней назад #
                    • Kama7482

                      Бред какой-то, у страницы для архива заголовка нет чтоли? Вместо $page->post_title вручную напиши Заголовок (в кавычках 'Заголовок').

                    • Вставил 'Заголовок'
                      и стало все правильно

                       Главная » Заголовок (ссылка на "business") » Купля-продажа, поставка
                    • Kama7482

                      Это хорошо, а почему у записи заголовка нет, меня удивляет, как это так? $page->post_title пустой. В админке у записи заголовок есть? smile

                    • пардон,
                      в Главная » Заголовок (ссылка идет на "Купля-продажа, поставка") » Купля-продажа, поставка

                    • В админке у записи заголовок есть?

                      да, конечно

Здравствуйте, !     Войти . Зарегистрироваться