Kama Breadcrumbs
- Заметки по Микроразметке
- Примеры переезда со старой версии Kama Breadcrumbs 3
- Удаляем дублированные строки в каждой следующей части крошек
- Поддержка плагина qtranslate-xt
- Установка через composer
Плагин создает цепочку ссылок от главной до текущей просматриваемой страницы. Такую цепочку принято называть «хлебные крошки».
Это новая версия — более простой, стабильный, расширяемый и понятный код. Измененная система хуков. Дополнительный функционал. Прошлый код значительно доработан.
Вывод крошек в теме (Использование)
Используйте следующий код в файле темы, там где нужно вывести крошки.
<?php do_action( 'echo_kama_breadcrumbs' ) ?>
Или можно вызвать с передачей параметров:
<?php $args = [ 'sep' => ' › ', 'on_front_page' => false, 'show_post_title' => false, //'markup' => 'Microdata', // RDFa, Microdata, data-vocabulary.org //'priority_tax' => [ 'category' ], //'number_tax' => [ 'category' => 2 ], //'disable_tax' => [ 'post_tags' ], ]; $l10n = [ 'tag' => 'Метка: <b>%s</b>', ]; do_action( 'echo_kama_breadcrumbs', $args, $l10n ); ?>
Когда нужно получить HTML крошек (не выводить на экран), используйте код:
$breadcrumbs = kama_breadcrumbs( $args, $l10n ); // теперь выводим там где нужно echo $breadcrumbs;
Параметры $args
Настройки вывода крошек указываются в виде массива, в параметре $args. Возможные элементы массива:
- sep(строка)
- Разделитель. Можно указать вместе с HTML оберткой:
<span> » </span>
.
По умолчанию: ' » ' - on_front_page(true/false)
- Выводить крошки на главной странице.
По умолчанию: true - show_post_title(true/false)
- Показывать ли название записи в конце (последний элемент). Для записей, страниц, вложений.
По умолчанию: true - show_term_title(true/false)
- Показывать ли название элемента таксономии в конце (последний элемент). Для меток, рубрик и других такс.
По умолчанию: true - last_sep(true/false)
- показывать последний разделитель, когда заголовок в конце не отображается.
По умолчанию: true - nofollow(true/false)
- Добавлять
rel=nofollow
к ссылкам?
По умолчанию: false - wrap_class(строка)
- CSS класс для главного
div
.
По умолчанию: 'kama_breadcrumbs' - link_class(строка)
- CSS класс для элемента крошек
a
.
По умолчанию: 'kb_link' - title_class(строка)
- CSS класс заголовка элемента.
По умолчанию: 'kb_title' - sep_class(строка)
- CSS класс разделителя.
По умолчанию: 'kb_sep' - priority_tax(массив)
Приоритетные таксономии, нужно когда запись находится в нескольких таксономиях:
array( 'category', 'tax_name' )
.
Порядок имеет значение — чем раньше тем важнее.В значениях можно указать приоритетные элементы таксономий, тогда название таксономии нужно указывать в ключе.
Когда запись находится в нескольких элементах одной таксы одновременно. Например:
array( 'category' => [ 45, 'term_name', 'имя терма' ], 'tax_name' => [ 1, 2, 'name' ] )
В этом коде
category
- это название таксономии для которой указываются приоритетные элементы.45
- ID терминаterm_name
- ярлык-
имя терма
- заголовок.Порядок
45
,term_name
иимя терма
имеет значение: чем раньше тем важнее. Все указанные термины важнее неуказанных.
По умолчанию: array()
- disable_tax
- Таксономии которые нужно исключить из показа в крошках:
array( 'post_tag', 'tax_name' )
По умолчанию: array() - number_tax
Позволяет выводить в крошках для записей сразу несколько таксономий.
Например, если указать
[ 'post' => 2 ]
, то для типа записиpost
выведет крошки для двух таксономий по умолчанию:category
иpost_tag
.Поменять порядок можно в параметре
priority_tax
.
По умолчанию: array()- markup(string/array)
Микроразметка. Может быть:
Microdata
- подробнее про разметку.RDFa
- подробнее про разметку.data-vocabulary.org
.''
- без микроразметки.
Можно указать свой массив разметки, например:
'markup' => [ '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>' ],
По умолчанию: 'Microdata'
- JSON_LD(true/false)
- Следует ли добавлять микроразметку JSON-LD в HTML.
По умолчанию: true - use_the_title_filter(true/false)
- Использовать ли фильтр the_title для заголовков записей.
По умолчанию: false
Параметры $l10n
Параметры строк (локализации) указываются в параметре $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' );
Строки переводятся на англ. если у сайта выбран англ. язык.
Фильтры (хуки)
Все хуки плагина. Ниже показан код как хук определяется в плагине:
// Позволяет отключить вывод крошек if( apply_filters( 'disable_kama_breadcrumbs', null ) ) return;
// фильтрует строки локализации - $l10n - это массив $l10n = apply_filters( 'kama_breadcrumbs_l10n', $l10n );
// фильтрует параметры - $args - это массив $args = apply_filters( 'kama_breadcrumbs_args', $args );
// вывод: все виды записей с терминами, или термины $term = apply_filters( 'kama_breadcrumbs_term', $term );
// возможность изменить элементы крошек /** * Allows change breadcrumbs elements. * * @param Kama_Breadcrumbs_Elem[] $elms Multidimensional associative array of breadcrumbs elements. * @param Kama_Breadcrumbs $this Object of current class. * @param WP_Post_Type|null $ptype Post Type object. Null when post type for the current query is not detected. */ $elms = apply_filters( 'kama_breadcrumbs_filter_elements', $elms, $this, $this->ptype );
// возможность изменить элементы крошек, // после того, как все элементы были собраны в одномерный (плоский) массив /** * Allows change breadcrumbs elements after it's all elements where * collected in the flat array. * * @param Kama_Breadcrumbs_Elem[] $elms Associative array of elements. * @param Kama_Breadcrumbs $this Object of current class. * @param WP_Post_Type|null $ptype Post Type object. Null when post type for the current query is not detected. */ $flat_elms = apply_filters( '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', 'my_kama_breadcrumbs_args' ); function my_kama_breadcrumbs_args( $args ){ $my_args = [ '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' ], ]; return $my_args + $args; }
Локализация (строки перевода)
// изменим строки перевода add_filter( 'kama_breadcrumbs_l10n', 'my_kama_breadcrumbs_l10n' ); function my_kama_breadcrumbs_l10n( $l10n ){ $my_l10n = [ 'home' => '<i style="display:none;">Главная</i><span class="dashicons dashicons-admin-home"></span>', 'tax_tag' => 'По метке: <b>%3$s</b>', ]; return $my_l10n + $l10n; }
Изменение/Добавление элементов крошек
Чтобы изменить имеющие УРЛ в крошках или добавить свои крошки нужно использовать фильтр kama_breadcrumbs_filter_elements
.
Функция прикрепленная к этому фильтру получает массив и должна вернуть измененный массив. Этот массив - это и есть крошки, только в виде многомерного массива, он потом превратиться в HTML код крошек.
Для изменения или создания элементов крошек используются два метода (они автоматически создают указанную в параметре markup
микроразметку):
// для любого элемента крошек (кроме последнего) $class->makelink( $url, $title ) // для последнего элемента крошек (ссылка будет выводится, только если нужна) $class->maketitle( $url, $title )
Код нужно вставлять в файл темы functions.php или куда-либо еще, главное до того как будут выведены крошки.
#1 Пример изменения элементов крошек
Чтобы все было понятно пройдусь по шагам.
Все изменения с крошками делаются через фильтр kama_breadcrumbs_filter_elements
. Для начала посмотрим что лежит в крошках, чтобы понимать какие ключи массива есть:
add_filter( 'kama_breadcrumbs_filter_elements', 'kama_breadcrumbs_filter_elms', 11, 3 ); function kama_breadcrumbs_filter_elms( $elms, $class, $ptype ){ die( print_r( $elms ) ); }
В результате вы увидите такой массив (если мы на странице поста):
Array ( [home] => Array ( [0] => Kama_Breadcrumbs_Elem Object ( ... ) ) [home_after] => Array( ) [single] => Array ( [category__tax_crumbs] => Array ( [0] => Kama_Breadcrumbs_Elem Object( ... ) [1] => Kama_Breadcrumbs_Elem Object( ... ) ) ) )
Как видим тут 3 крошки: home > category > category (орриентируйтесь по ключам массива - они не меняются и зависят от типа данных к которым относится конкретная крошка).
Теперь, например, нам нужно изменить ссылку на главную, для этого меняем крошку которая находится в ключе home
:
add_filter( 'kama_breadcrumbs_filter_elements', function( $elms, $class, $ptype ){ $elms['home'] = $class->makelink( 'https://site.com/path', 'Title' ); return $elms; // не забываем вернуть }, 11, 3 );
Или можно добавить еще одну крошку после ссылки на главную, для этого закидываем еще один элемент в массив с ключом home
:
add_filter( 'kama_breadcrumbs_filter_elements', function( $elms, $class, $ptype ){ $elms['home'][] = $class->makelink( 'https://site.com/path', 'Title' ); return $elms; // не забываем вернуть }, 11, 3 );
По такой системе можно удалять/изменять/добавлять крошки как угодно.
Важно отметить, что массив понимает любой уровень вложенности. Например, можно написать так и все будет работать:
add_filter( 'kama_breadcrumbs_filter_elements', function( $elms, $class, $ptype ){ $elms['home'][] = [ 'foo' => [ $class->makelink( 'https://site.com/path', 'Title' ) ] ]; return $elms; // не забываем вернуть }, 11, 3 );
#2 Добавим элементы крошек после ссылки на главную
// добавить свои ссылки в крошки add_filter( 'kama_breadcrumbs_filter_elements', 'breadcrumbs_add_elements', 10, 3 ); function breadcrumbs_add_elements( $elms, $class, $ptype ){ global $post; // смотрим какие элементы есть в массиве и добавляем куда и что нужно // print_r( $elms ); // запись находится в рубрике mycat if( is_single() && has_category( 'mycat', $post ) ){ // добавим 2 ссылки (2 элемента) после главной $elms['home'][] = [ $class->makelink( '/inventory', 'Инвентарь' ), $class->makelink( '/other', 'Другое' ) ]; } return $elms; }
#3 Пример для 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_permalink( $page ), get_the_title( $page ) ); } else { $elms['home_after'] = $class->makelink( get_permalink( $page ), get_the_title( $page ) ); } } return $elms; }
#4 Варианты добавить «крошку» после главной
add_filter( 'kama_breadcrumbs_filter_elements', 'kama_breadcrumbs_add_elements', 10, 3 ); function kama_breadcrumbs_add_elements( $elms, $class, $ptype ){ // можно так: $elms['home_after'][] = $class->makelink( 'http://example.com/functions', 'Функции' ); // или сотрем имеющиеся элементы и добавим свой: $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', 'Хуки' ), ]; return $elms; }
Массив $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> ) )
В этот массив можно добавлять свои элементы. В значении может быть строка или вложенный массив. В результате все значения этого многомерного массива будут собраны и выведены в крошках по порядку.
Названия ключей массива $elms. Например, home_after, нужны, чтобы проще было «сунуть» свою ссылку в нужное место, на работу кода они не влияют. Т.е. при добавлении своих элементов, ключ массива можно указать любой или вообще не указывать.
Получение массива крошек (не HTML код)
С версии 4.22 было добавлено два метода, чтобы можно было получить массив данных крошек, без вывода HTML кода на экран.
$args = []; $breadcrumbs = new Kama_Breadcrumbs( $args ); print_r( $breadcrumbs->get_crumbs_flat_elements() ); // или print_r( $breadcrumbs->get_crumbs_elements() );
Удаление элементов из крошек
Когда нужно удалить существующие элементы, так же как и при добавлении используем фильтр kama_breadcrumbs_filter_elements
.
Так, чтобы например удалить ссылку Главная, нужно удалить элемент массива, точнее очистить его:
// изменяем крошки add_filter( 'kama_breadcrumbs_filter_elements', 'breadcrumbs_change_elements', 10, 3 ); function breadcrumbs_change_elements( $elms, $class, $ptype ){ global $post; // смотрим какие элементы есть в массиве и добавляем куда и что нужно // print_r( $elms ); // удалим ссылку на главную (очистим элемент home там лежит элемент "главная") $elms['home'] = []; return $elms; }
Отключить крошки (по условию)
Допустим нам нужно отключить вывод хлебных крошек на странице /profile
. Сделать это можно через фильтр disable_kama_breadcrumbs:
add_filter( 'disable_kama_breadcrumbs', function(){ return is_page('profile'); } );
Или если крошки у вас выводятся через хук echo_kama_breadcrumbs, то можно просто убрать все прикрепленные к нему функции:
add_action( 'wp', function(){ if( is_page('profile') ){ remove_all_filters( 'echo_kama_breadcrumbs' ); } } );
Изменение классов под БЭМ верстку
## параметры по умолчанию — kama_breadcrumbs add_filter( 'kama_breadcrumbs_args', function( $args ) { $base = isset($args['bem']['base']) ? $args['bem']['base'] : 'breadcrumbs'; $mods = isset($args['bem']['mods']) ? $args['bem']['mods'] : []; $inner = $base . '__inner'; $item = $base . '__item'; $title = $base . '__title'; $link = $base . '__link'; $sep = $base . '__sep'; $base_mod = isset($mods['base']) ? ' ' . $base . '--' . $mods['base'] : ''; $inner_mod = isset($mods['inner']) ? ' ' . $inner . '--' . $mods['inner'] : ''; $item_mod = isset($mods['item']) ? ' ' . $item . '--' . $mods['item'] : ''; $title_mod = isset($mods['title']) ? ' ' . $title . '--' . $mods['title'] : ''; $link_mod = isset($mods['link']) ? ' ' . $link . '--' . $mods['link'] : ''; $sep_mod = isset($mods['sep']) ? ' ' . $sep . '--' . $mods['sep'] : ''; return array_merge( $args, [ 'sep' => ' — ', 'sep_class' => $sep . $sep_mod, // своя разметка 'markup' => [ 'wrappatt' => ' <div class="' . $base . $base_mod . '" itemscope itemtype="https://schema.org/BreadcrumbList"> <div class="' . $inner . $inner_mod . '">%s</div> </div>', 'linkpatt' => ' <span class="' . $item . $item_mod . '" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> <a href="%s" class="' . $link . $link_mod . '">%s</a> <meta itemprop="item" content="PERMALINK" /> <meta itemprop="name" content="NAME" /> <meta itemprop="position" content="ORDERNUM" /> </span>', 'titlepatt' => ' <span class="' . $title . $title_mod . '" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem"> %s <meta itemprop="item" content="PERMALINK" /> <meta itemprop="name" content="NAME" /> <meta itemprop="position" content="ORDERNUM" /> </span> ', ], ] ); } ); ## пример использования в шаблоне: $bc_args = [ 'bem' => [ 'mods' => [ 'inner' => 'grey_class', 'link' => 'red_color', ], ] ]; echo kama_breadcrumbs( $bc_args ); /** * Выведет: * - у враппера class="breadcrumbs__inner breadcrumbs__inner--grey_class" * - у ссылок class="breadcrumbs__link breadcrumbs__link--red_color" */