Как добавить хлебные крошки в WordPress без плагина

Хлебные крошки показывают, где находится текущая страница и как вернуться к разделам выше. В 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-разметки помогает однозначно описать структуру цепочки, но само по себе не гарантирует её отображение в результатах поиска: поисковые системы самостоятельно решают, показывать ли хлебные крошки и в каком виде. Ручная реализация подходит, когда нужно контролировать вывод и не подключать отдельный плагин; при изменении структуры сайта проверяйте, что выбранная категория и родительские страницы по-прежнему соответствуют навигации.

Как добавить пользовательские поля в WordPress и вывести их на сайте
23.10.2026
Как добавить хлебные крошки в WordPress без плагина
11.11.2026
Как убрать пагинацию архивов WordPress из индексации
09.10.2026
Как создать собственный тип записей в WordPress
28.10.2026
Как создать таксономию в WordPress и привязать её к записям
31.10.2026