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_after'][] = [
			$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>
			',
		],
	) );
} );
меню

Еще примеры

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

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

    Ответить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 #
  • Здравствуйте. Купил плагин, а для обновлений куда лицензию вводить?

    Ответить22.Янв.2020 в 17:40 #