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

Kama Breadcrumbs

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

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

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

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

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

<?php do_action( 'echo_kama_breadcrumbs' ) ?>

Или можно вызвать так с передачей параметров:

<?php do_action( 'echo_kama_breadcrumbs', $args, $l10n ) ?>

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

$breadcrumbs = kama_breadcrumbs( $args, $l10n );
$args(массив)

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

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

	'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'    => [],
						 // с версии 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('post_tag', 'tax_name')
	'number_tax'      => [], // позволяет выводить в крошках для записей сразу несколько таксономий.
							 // Пример: 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', [ $elms, &$this, $ptype ] );

// возможность изменить элементы крошек, 
// после того, как все элементы были собраны в одномерный (плоский) массив
$flat_elms = apply_filters_ref_array( 'kama_breadcrumbs_filter_flat_elements', [ $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;
} );

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

Коды ниже нужно вставлять в файл темы functions.php.

#1 Добавим элементы крошек после ссылки на главную

// добавить свои ссылки в крошки
add_filter( 'kama_breadcrumbs_filter_elements', 'breadcrumbs_add_elements', 10, 3 );
function breadcrumbs_add_elements( $elms, $class, $ptype ){
	global $post;

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

	// добавим 2 ссылки (2 элемента) после главной, если запись находится в рубрике mycat
	if( is_single() && has_category( 'mycat', $post ) ){

		$elms['home'][] = [
			$class->makelink( '/inventory', 'Инвентарь' ),
			$class->makelink( '/other', 'Другое' )
		];
	}

	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() ) {

		$page = get_post( wc_get_page_id( 'shop' ) );

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

	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>
	)

)

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

Для удобного создания элементов массива (с разметкой 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>
			',
		],
	) );
} );
меню

Еще примеры

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

68 комментов
Полезные 5 Вопросы 2 Все
  • Привет, подскажи, пожалуйста, как исправить проблему? Стал ругаться гугл: "Отсутствует поле "position".. help

    3
    Ответить29.Дек.2019 03:49 #
  • Denys c0294.paas1.ams.modxcloud.com/en/artists

    Привет. Подскажи пожалуйста. У меня на сайте много кастомных типов. Например кастомный тип: artistas. Я нашел в wpml как настроить английский url тоесть http://c0294.paas1.ams.modxcloud.com/en/artists/ но в крошах все также пишется Home > Artistas. Возможно есть како-то фильтр чтоб можно было изменить урл в крошках?

    Ответить14.Янв.2020 03:08 #
    • Проблема решена. Я оказывается пользовался старым кодом. Купил плагин и сделал фильтр. p.s. Описание плагина на русском. Нужно сделать и на других языкам. У меня сайт на испанском и в админке все на испанском и тут русское описаниеsmile

      Ответить17.Янв.2020 00:58 #
      • Kama7745

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

        Ответить30.Янв.2020 13:18 #
  • Здравствуйте. Купил плагин, а для обновлений куда лицензию вводить?

    Ответить22.Янв.2020 17:40 #
  • Добрый день, купил плагин, что бы правильно работали крошки для такого функционала: https://wp-kama.ru/id_7637/chpu-dlya-treh-taksonomij-i-tipa-zapisi-odnovremenno.html
    Но после установки показывает только крошки Городов, остальные таксаномии не показывает. Подскажите пожалуйста, как исправить?

    Ответить27.Янв.2020 16:37 #
    • Kama7745

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

      1. Указать параметр 'number_tax' => [] при вызове крошек или через хук. Этот параметр позволяет выводить в крошки для записей сразу несколько таксономий. Пример: 'number_tax' => [ 'post'=>2 ] - для типа записи post выведет крошки для двух таксономий (по умолчанию: category и post_tag).

      2. Чтобы все таксономии были привязаны к типу записи. Узнать какие привязаны можно через get_object_taxonomies(). Насильно привязать можно с помощью register_taxonomy_for_object_type(). Обычно такая привязка указывается при регистрации таксы.
      Ответить27.Янв.2020 21:30 #
      • Спасибо за ответ. Я видел комментарии в коде, но как не пробовал ничего не получалось (стоит чистый wordpress, без плагинов, на голой сгенерированной теме).

                'disable_tax'     => [],
        		'number_tax'      => [ 'services'=>5 ],
        		'markup'          => 'Microdata',
        Ответить27.Янв.2020 23:42 #
        • Kama7745

          Еще раз, что нужно и что есть? Возможно ваши созданные таксономии не прикреплены к типу записи, поэтому плагин не может их подхватить...

          Ответить28.Янв.2020 18:46 #
          • Есть тип записи и таксономии из вашей статьи: https://wp-kama.ru/id_7637/chpu-dlya-treh-taksonomij-i-tipa-zapisi-odnovremenno.html Все точно также. По поводу прикреплены ли таксономии, я не знаю - если у вас в статье они прикреплены, то и у меня прикреплены.

            Далее активировал плагин, активировал лицензию, и вставил <?php echo kama_breadcrumbs( ); ?> в шаблон архива и записи. Но в хлебных крошках показывает только таксономии города (даже показывает несколько: родительскую и дочернюю), но вот "тип недвижимости" и "тип сделки" не показывает.

            Думаю, что таксономии подключены, так как бесплатный код (этот: https://wp-kama.ru/id_541/samyie-hlebnyie-kroshki-breabcrumbs-dlya-wordpress.html) работал, все таксаномии показывались в хлебных крошках, но с багами (текущая страница в хлебных крошках была ссылкой), по этому решил купить данный плагин.

            Если внутри поста я вставляю <?php the_taxonomies( $args ); ?> то мне показывает, что к посту относятся все три таксономии (термины), на сколько я понимаю, все таксаномии у меня подключены к типу записи.

            Если вставлять <?php $taxonomy_names = get_object_taxonomies( 'realty' ); print_r( $taxonomy_names); ?>, то выводиться вот это: Array ( [0] => country [1] => type_realty [2] => type_deal )

            Ответить28.Янв.2020 18:59 #
            • Kama7745

              Обновитесь до версии 4.8.6 поправил там этот момент. Сделал чуть более универсальный вариант обработки исключений для такс. Теперь все будет работать!

              Ответить30.Янв.2020 13:04 #
              • Ничего не поменялось. Я уже запутался, какой функцией вызывать... Нужно ли что то дописывать дополнительно...

                <?php do_action( 'echo_kama_breadcrumbs' ) ?>
                • так же выводиться только одна таксаномия.

                В файлах плагина поставил "3" и отобразились все таксаномии(но только внутри поста, в архивах все также одна таксановия):

                // количество таксономий в крошках
                $number_tax = 3;
                if( isset( $arg->number_tax[ $post->post_type ] ) ){
                	$number_tax = (int) $arg->number_tax[ $post->post_type ];
                }
                $number_tax_i = $number_tax;
                Ответить30.Янв.2020 15:51 #
                • Kama7745

                  Параметр $number_tax в коде изменяется через одноименный параметр в параметрах, не надо менять код:

                  'number_tax'  => [ 'realty'=>3 ], 

                  Да, это будет работать только для страницы поста. Как это может работать универсально на странице архива, не очень понимаю. Например, пост привязан к таксономиям, но ведь таксономия не привязана к другим таксономиям и как их там можно выводить? Если я вообще правильно понял. Можно пример того что нужно на страницах архивов.

                  Вызываешь так:

                  <?php
                  do_action( 'echo_kama_breadcrumbs', [
                  	'priority_tax' => [ 'country', 'type_deal', 'type_realty' ],
                  	'number_tax'   => [ 'realty'=>3 ],
                  ] )
                  ?>

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

                  Ответить1.Фев.2020 10:05 #
                  • Вот пример:
                    Главная » Москва
                    Главная » Москва » Аренда
                    Главная » Москва » Аренда » Дом.

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

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

                    Ответить1.Фев.2020 10:47 #
                    • Kama7745

                      Что конкретно работало в бесплатной версии? Там точно нет дополнительного кода к бесплатной версии, раз там работало? Что-то тут не то...

                      Тут тоже все будет работать, надо только чуть дополнить плагин своим кодом, под свою конкретную задачу.

                  • Что значит:

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

                    У вас написано:

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

                    Когда покупаешь, там не то что бы расширенная и стабильная версия, там половины функционала нет. Зачем я тогда приобретал этот плагин?

                    Ответить1.Фев.2020 15:26 #
                    • Kama7745

                      Что значит:

                      Это значит что плагин позволяет ппц удобно добавить свои элементы крошек, у него лучший код и отсутствуют некоторые баги и я его поддерживаю (и в случае обнаружения бага поправлю его как можно быстрее). Тебе надо проверить находишся ли ты на нужной странице рубрики и если да, всунуть нужную крошку. Это делается не сложно. см. пример "#1 Добавим элементы крошек после ссылки на главную".

                      Она расширенная и стабильная, какого функционала там нет? Твоя задача пипец нестандартная, ни один плагин из коробки не решит её, потому что это невозможно - там нет единой логики! Таких задач может быть сотни похожих, но разных. Именно поэтому в плагине есть хук, через который ты можешь ну очень просто добавить элементы крошек. Выше есть пример как это делать. Тут ты можешь спросить.

                      Если плаг не устраивает, я верну деньги, там денег то...

  • не выводит сепаратор разделитель » куда копать?

    Ответить3.Фев.2020 20:58 #
    • Kama7745

      Что значит не выводит? Через стили спрятано может?

      1
      Ответить3.Фев.2020 21:51 #
      • вывожу в шаблоне инициализирую как написано выше.

        пришлось в function.php добавить, так заработало...

        // установим параметры по умолчанию
        add_filter( 'kama_breadcrumbs_args', function($args){
        	return [
        		'sep'             => ' » ', //
        	]
        	+ $args;
        } );

        так заработало по умолчанию нет(

        а и еще в гугле

        google говорит ошибка, что делать как быть?

        Ответить3.Фев.2020 21:54 #
        • Kama7745

          так заработало по умолчанию нет(

          Такого не может быть, как вызывал?

          а и еще в гугле

          А что за ошибка, что пишет?

          Ответить6.Фев.2020 08:54 #
          • ошибку исправил а вызывал стандартно

            <?php do_action( 'echo_kama_breadcrumbs' ) ?>
            Ответить6.Фев.2020 10:30 #
  • @ mihdan426 www.kobzarev.com

    Тимур, а можно ли использовать твой класс через composer? Или его нет на гитхабе и прочих?

    Ответить20.Фев.2020 02:50 #
  • @ Romka1 unrealthemes.ru

    Долго пользовался бесплатной функцией и жмотился купить плагин))
    И вот всётаки решился, и да - всё на хуках, можно переделывать структуру как угодно, ОЧЕНЬ удобно!! Спасибо за работу good

    1
    Ответить29.Мар.2020 01:24 #
  • Кама, здравствуйте! Только что обновила плагин и оказалось, что Ваши предложения из #1 Добавим элементы крошек после ссылки на главную - неверно работают в записях произвольного типа (на обычных не проверяла, ибо добавить всякое надо было только в if( is_singular('lalala') ), ранее не добавляла свои элементы крошек).

    $elms['home_after'][] = [
    			...
    		];

    пришлось заменить на

    $elms['home'][] = [
    			...
    		];

    иначе крохи добавлялись в самый конец (перед именем записи).

    Но мне это даже на руку)) как раз нужно было и туда и суда воткнуть)

    Проверьте код из #1 Добавим элементы крошек после ссылки на главную, пожалуйста! (Вдруг это только в моём огороде так, а всё горожу-горожу да людей в смуту ввожу))

    1
    Ответить26.Апр.2020 16:51 #
    • Kama7745

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

      Так что да, пример неправильный, поправлю, спасибо! thank_you

      П.С. С обновлениями плагина это никак не связано, так было изначально.

      Ответить27.Апр.2020 00:47 #
  • Привет, если я куплю плагин, я смогу решить подобную проблему - в Woocommerce на странице категории надо выводить в таком виде "Главная / Автосалон (главная страница магазина) / Название категории"?
    а на главной странице магазина просто "Главная / Автосалон (главная страница магазина)"

    Ответить2.Июл.2020 15:44 #