Хлебные крошки показывают, где находится текущая страница и как вернуться к разделам выше. В WordPress их можно вывести без плагина: добавить функцию в дочернюю тему, а затем вызвать её в шаблоне или через блок шорткода. Ниже — пример с главной страницей, страницами, записями, архивами и разметкой Schema.org.
Не вставляйте код в файлы родительской темы: при её обновлении изменения могут исчезнуть. Перед редактированием файлов сохраните резервную копию сайта. Ошибка PHP может привести к сбою страницы, поэтому сначала проверьте код на тестовом сайте или в дочерней теме.
Добавьте функцию в дочернюю тему
Вставьте код в файл functions.php дочерней темы. Если у дочерней темы такого файла ещё нет, создайте его с открывающим тегом PHP <?php. Код формирует цепочку из ссылок и текущей страницы, а также добавляет микроразметку BreadcrumbList. Для обычной записи берётся первая категория из назначенных ей категорий; для страницы — её родители.
function wptasks_add_term_crumbs( &$items, $term ) {
$ancestor_ids = array_reverse(
get_ancestors( $term->term_id, $term->taxonomy, 'taxonomy' )
);
foreach ( $ancestor_ids as $ancestor_id ) {
$ancestor = get_term( $ancestor_id, $term->taxonomy );
if ( $ancestor instanceof WP_Term && ! is_wp_error( $ancestor ) ) {
$items[] = array(
'label' => $ancestor->name,
'url' => get_term_link( $ancestor ),
);
}
}
}
function wptasks_breadcrumbs() {
if ( is_front_page() ) {
return '';
}
$items = array(
array(
'label' => get_bloginfo( 'name' ),
'url' => home_url( '/' ),
),
);
if ( is_singular() ) {
$post = get_queried_object();
if ( $post instanceof WP_Post ) {
if ( 'page' === $post->post_type ) {
$ancestor_ids = array_reverse( get_post_ancestors( $post ) );
foreach ( $ancestor_ids as $ancestor_id ) {
$ancestor = get_post( $ancestor_id );
if ( $ancestor instanceof WP_Post ) {
$items[] = array(
'label' => get_the_title( $ancestor ),
'url' => get_permalink( $ancestor ),
);
}
}
} elseif ( 'post' === $post->post_type ) {
$categories = get_the_category( $post->ID );
if ( ! empty( $categories ) ) {
$category = $categories[0];
wptasks_add_term_crumbs( $items, $category );
$items[] = array(
'label' => $category->name,
'url' => get_category_link( $category->term_id ),
);
}
} else {
$post_type = get_post_type_object( $post->post_type );
$archive_url = get_post_type_archive_link( $post->post_type );
if ( $post_type && $archive_url ) {
$items[] = array(
'label' => $post_type->labels->name,
'url' => $archive_url,
);
}
}
$items[] = array(
'label' => get_the_title( $post ),
'url' => '',
);
}
} elseif ( is_category() || is_tag() || is_tax() ) {
$term = get_queried_object();
if ( $term instanceof WP_Term ) {
wptasks_add_term_crumbs( $items, $term );
$items[] = array(
'label' => $term->name,
'url' => '',
);
}
} elseif ( is_post_type_archive() ) {
$post_type = get_queried_object();
if ( $post_type && isset( $post_type->labels->name ) ) {
$items[] = array(
'label' => $post_type->labels->name,
'url' => '',
);
}
} elseif ( is_search() ) {
$items[] = array(
'label' => sprintf( 'Результаты поиска: %s', get_search_query() ),
'url' => '',
);
} elseif ( is_404() ) {
$items[] = array( 'label' => 'Страница не найдена', 'url' => '' );
} elseif ( is_home() ) {
$posts_page_id = (int) get_option( 'page_for_posts' );
$label = $posts_page_id ? get_the_title( $posts_page_id ) : 'Записи';
$items[] = array( 'label' => $label, 'url' => '' );
} elseif ( is_archive() ) {
$items[] = array( 'label' => get_the_archive_title(), 'url' => '' );
}
if ( 1 === count( $items ) ) {
return '';
}
ob_start();
?>
<nav class="breadcrumbs" aria-label="Хлебные крошки" itemscope itemtype="https://schema.org/BreadcrumbList">
<ol>
<?php foreach ( $items as $index => $item ) : ?>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<?php if ( ! empty( $item['url'] ) ) : ?>
<a itemprop="item" href="<?php echo esc_url( $item['url'] ); ?>">
<span itemprop="name"><?php echo esc_html( $item['label'] ); ?></span>
</a>
<?php else : ?>
<span itemprop="name"><?php echo esc_html( $item['label'] ); ?></span>
<?php endif; ?>
<meta itemprop="position" content="<?php echo (int) $index + 1; ?>">
</li>
<?php endforeach; ?>
</ol>
</nav>
<?php
return ob_get_clean();
}
add_shortcode( 'wptasks_breadcrumbs', 'wptasks_breadcrumbs' );
Функция использует штатные функции WordPress для получения записей, родителей страниц и терминов таксономий. Если запись относится к нескольким категориям, в цепочку попадёт первая категория, которую вернёт get_the_category(). Если для структуры сайта важно всегда показывать конкретную категорию, закрепите её выбор в логике сайта или используйте отдельное поле — иначе цепочка может отличаться от ожидаемой.
Выведите цепочку в нужном месте
В классической теме вызовите функцию в шаблоне, например в single.php, page.php или общем шаблоне перед основным содержимым:
<?php echo wptasks_breadcrumbs(); ?>
Размещайте вызов там, где крошки должны отображаться на сайте. Если вставить его только в single.php, на страницах и архивах цепочки не будет. Не добавляйте вызов одновременно в несколько шаблонов, иначе крошки выведутся дважды.
В блочной теме можно добавить блок «Шорткод» в шаблон или шаблонную часть и вставить [wptasks_breadcrumbs]. Это удобнее, если нужное место можно настроить через редактор сайта. Если шорткод выводится в неожиданном месте или не обрабатывается конкретной темой, используйте подходящую шаблонную часть темы.
Настройте внешний вид
Разметка не задаёт оформление: отступы, разделители и цвета нужно настроить в стилях дочерней темы или через дополнительные CSS в настройках сайта. Например, этот CSS выведет элементы в одну строку и добавит разделитель:
.breadcrumbs ol {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin: 0;
padding: 0;
list-style: none;
}
.breadcrumbs li:not(:last-child)::after {
content: "/";
margin-left: 0.5rem;
}
.breadcrumbs a {
text-decoration: none;
}
Цвета, шрифт и размеры задайте под дизайн темы. Ссылка на главную и промежуточные разделы должна оставаться различимой и доступной для перехода; текущую страницу в примере ссылка не оборачивает.
Проверьте результат и учтите ограничения
Откройте запись, вложенную страницу и архив категории: на каждой странице должна отображаться подходящая цепочка, а на главной она намеренно скрыта. Проверьте также страницу поиска и адрес, который возвращает 404, если такие элементы нужны вашему сайту. Для блочной темы убедитесь, что шорткод вставлен в шаблон, а не только в одну запись.
Посмотрите исходный HTML страницы: должна присутствовать навигация с подписью «Хлебные крошки», список элементов и микроразметка с позициями. Ошибки PHP проверяйте в журнале сайта или на тестовой копии. Если изменили functions.php и сайт перестал открываться, восстановите файл из резервной копии или исправьте синтаксическую ошибку через файловый менеджер хостинга.
Наличие Schema.org-разметки помогает однозначно описать структуру цепочки, но само по себе не гарантирует её отображение в результатах поиска: поисковые системы самостоятельно решают, показывать ли хлебные крошки и в каком виде. Ручная реализация подходит, когда нужно контролировать вывод и не подключать отдельный плагин; при изменении структуры сайта проверяйте, что выбранная категория и родительские страницы по-прежнему соответствуют навигации.