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

Kama Breadcrumbs

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

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

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

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

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

<?php echo kama_breadcrumbs(); ?>

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

<?php echo 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>
			',
		],
	) );
} );
меню

Еще примеры

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

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

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

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

    1
    Ответить6 мес назад #
    • Kama7538

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

      Ответить6 мес назад #
    • Kama7538

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

      Ответить6 мес назад #
  • @ Tmks2

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

    2
    Ответить3 мес назад #
    • Kama7538

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

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

    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 через админку.

    Ответить2 мес назад #
    • Kama7538

      Это нестандартное поведение, поэтому лучше всего думаю добавить фильтр куда-нибудь в 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).

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

        Ответить2 мес назад #
        • Kama7538

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

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

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

          Ответить2 мес назад #
          • Спасибо за ответ, но снова что-то не то 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/ как ничего и поменялось Главная » Купля-продажа, поставка

            -1
            Ответить2 мес назад #
            • Kama7538

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

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

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

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

                Ответить2 мес назад #
                • Kama7538

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

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

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

                    <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>
                    Ответить2 мес назад #
                    • Kama7538

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

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

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

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

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

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

                      да, конечно

  • User

    Добрый вечер! Не совсем пойму как добавить доп. элемент в крошки. Подскажите, пожалуйста.
    Я добавил в фильтр в functions.php, что нужно делать дальше?
    спасибо!

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

      В статье есть примеры, там все очень просто, я даже не знаю как помочь. Говори тогда, что конкрентно. на какой странице в какой элемент (или после какого) нужно добавить. Какая ссылка, какой анкор ссылки. Я тебе отвечу как это сделать.

      П.С. еще раз примеры посмотри...

      Ответить9 дней назад #
  • Здравствуйте, можно убрать из крошек ссылку на главную страницу?

    Ответить8 дней назад #
    • Kama7538

      В functions.php темы добавь такой код:

      // удалим ссылку на главную страницу из крошек
      add_filter( 'kama_breadcrumbs_filter_elements', function( $elms ){
      	unset( $elms['home'] );
      	return $elms;
      } );
      
      Ответить7 дней назад #
  • @ smat2

    Здравствуйте, а кроме WebMoney есть еще варианты оплаты? На странице оплаты нельзя выбрать варианты. Я с Украины, WebMoney тут с недавнего времени запрещены.

    Ответить7 дней назад #
  • @ smat2

    В первом примере "Добавим элементы крошек после ссылки на главную" ошибки нет?
    У меня эти 2 ссылки вставились не после "Главная", а в самый-самый конец крошек.
    А чтобы они стали вот именно сразу после пункта "Главная" я сделал так:

    // добавим 2 ссылки (2 элемента) после главной, если запись находится в рубрике mycat
    if( is_single() && has_category( 'mycat', $post ) ){
    
    	array_unshift( $elms['home_after'], array(
    		$class->makelink( '/inventory', 'Инвентарь' ),
    		$class->makelink( '/other', 'Другое' )
    	));
    }
    1
    Ответить2 дня назад #
    • Kama7538

      Нет, ошибки там нет, так правильно! На этом сайте именно так работает кое-где, где-то вариант с array_unshift() - это разные вещи, тот добавляет в конец массива, array_unshift в начало...

      До этого кода, выведи у себя что находится в $elems - print_r( $elems )? Сюда скинь, просто даже интересно почему так, полагаю, ты где-то до этого удаляешь home_after поэтому так получается.

      Ответить2 дня назад #
      • @ smat2

        У меня в $elems было так:

        Array ( 
        		[home]          => Главная 
        		[home_after]    => Array (
        			[0] => Дети
        		) 
        		[singular_lone] => Array ( 
        			[title] => Вася
        		)
        )

        Крошки такие:
        Главная > Дети > Вася

        Мне нужно было вставить ссылку на страницу "Отцы" между пунктами "Главная" и "Дети" (зачем - это уже совсем другая история).

        Если вставлять вот так:

        if ( is_single() && get_post_type() == 'childs' ) {
        	$elms['home_after'][] = [
        		$class->makelink( '/fathers', 'Отцы' )
        	];
        }

        то в крошках отцы становятся последней ссылкой, после детей:
        Главная > Дети > Отцы > Вася

        А если вставлять так:

        if ( is_single() && get_post_type() == 'childs' ) {
        	array_unshift( $elms['home_after'], array(
        		$class->makelink( '/fathers', 'Отцы' )
        	));
        }

        то получается как положено:
        Главная > Отцы > Дети > Вася

        Ответить2 дня назад #
        • Kama7538

          Все работает как часы. Так $elms['home_after'][] новый элемент добавляется в конец массива (там есть Дети, потом добавляется Отцы). Так array_unshift( новый элемент добавляется в начало массива (до Дети).

          Если Отцы Нужны были в самом начале, ты мог сделать как ты сделал или добавить после home:

          $elms['home'][] = $class->makelink( '/fathers', 'Отцы' );
          Ответитьвчера #
Здравствуйте, !     Войти . Зарегистрироваться