WordPress. Хлебные крошки без плагина

07.06.2019

Теги: CMSWeb-разработкаWordPressНавигацияФункцияХлебныеКрошки

Хлебные крошки — это способ навигации, который показывает расположение текущей страницы на сайте. Т.е. путь, по которому на нее можно попасть, начиная с главной страницы. Хлебные крошки полезны для сайтов со сложной структурой, с их помощью посетителю гораздо легче разобраться — в каком разделе он находится. И, если нужно, легко подняться на уровень выше и осмотреть ветку целиком.

Давайте напишем функцию, которая будет показывать на сайте цепочку навигации, и добавим ее в файл functions.php темы. Поскольку функция получилась большая, будем разбирать ее работу небольшими фрагментами.

Функция по частям

function echo_breadcrumbs($args = [], $echo = true) {
    /*
     * Сюда будем добавлять весь код, но по частям,
     * рассматривая все возможные ситуации: главная
     * страница, страница записи блога и т.п.
     */
}
    /*
     * Настройки хлебных крошек по умолчанию
     */
    $defaults = [
        // обертка для всех элементов хлебных крошек
        'wrapper' => ['<div class="breadcrumbs">', '</div>'],
        // шаблон для элемента хлебных крошек, ссылка
        'link' => '<a href="%HREF%">%TEXT%</a>',
        // шаблон для элемента хлебных крошек, текст
        'text' => '<span class="current">%TEXT%</span>',
        // разделитель для элеменов хлебных крошек
        'separator' => '<span class="separator"> › </span>',
        // показывать хлебные крошки на главной странице?
        'show_on_home' => true,
        // показывать в хлебных крошках текущую страницу?
        'show_current' => false,
    ];

    /*
     * Объединяем настройки по умолчанию и настройки, переданные
     * при вызове функции
     */
    $settings = wp_parse_args($args, $defaults);
    /*
     * В этом массиве будем накапливать все элементы хлебных крошек
     */
    $breadcrumbs = [];

    /*
     * Если это не страница списка записей (рубрика, архив), а отдельная запись
     * (пост, страница, вложение) — получаем ее родителя. Эта переменная нам
     * потребуется несколько раз ниже, поэтому получим ее значение один раз.
     */
    global $post;
    $parent_id = ($post) ? $post->post_parent : false;

    /*
     * Итак, добавляем первый элемент в хлебные крошки
     */
    $href = home_url('/');
    $text = 'Главная';
    $html = str_replace(
        ['%HREF%', '%TEXT%'],
        [$href, $text],
        $settings['link']
    );
    $breadcrumbs[] = $html;
    /*
     * Если мы находимся на главной странице сайта
     */
    if (is_front_page()) {
        /*
         * Здесь возможны две ситуации: когда на главной странице показывается
         * список последних записей блога или когда на главной показывается
         * статическая страница. В случае статической страницы, больше ничего
         * делать не надо, в хлебных крошках всего один элемент.
         */
        // на главной показывается список последних записей
        if (get_query_var('paged')) {
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        }
        // если на главной не надо показывать хлебные крошки,
        // просто очищаем массив $breadcrumbs
        if (!$settings['show_on_home']) {
            $breadcrumbs = [];
        }
    }
    /*
     * Если мы находимся на странице последних записей блога,
     * но это не главная страница
     */
    if (is_home() && !is_front_page()) {
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', false);
        // наименование страницы, где показываются последние записи
        $title = get_the_title($page_for_posts);
        /*
         * Если это не первая страница последних записей (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                $text = $title;
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на странице списка записей рубрики
     */
    if (is_category()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Добавляем в массив ссылки на всех родителей этой рубрики
         */
        $parents = get_ancestors(get_query_var('cat'), 'category');
        foreach (array_reverse($parents) as $cat) {
            $href = get_category_link($cat);
            $text = get_cat_name($cat);
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        if (get_query_var('paged')) {
            /*
             * Если это не первая страница рубрики (постраничная навигация),
             * то сначала добавляем в массив $breadcrumbs ссылку на рубрику,
             * а потом — текст «Страница N»
             */
            // добавляем в массив ссылку на рубрику
            $cat = get_query_var('cat');
            $href = get_category_link($cat);
            $text = get_cat_name($cat);
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            /*
             * Если это первая страница рубрики, просто добавляем
             * в массив $breadcrumbs название рубрики
             */
            if ($settings['show_current']) {
                $text = single_cat_title('', false);
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на статической странице (тип записи «page»)
     */
    if (is_page() && !is_front_page() && !is_attachment()) {
        if ($parent_id) {
            /*
             * Если у страницы есть родитель
             */
            // получаем всех предков страницы и добавляем в массив
            $parents = get_post_ancestors(get_the_ID());
            foreach (array_reverse($parents) as $id) {
                $href = get_page_link($id);
                $text = get_the_title($id);
                $html = str_replace(
                    ['%HREF%', '%TEXT%'],
                    [$href, $text],
                    $settings['link']
                );
                $breadcrumbs[] = $html;
            }
            if ($settings['show_current']) {
                $text = get_the_title();
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        } else {
            /*
             * Если у страницы нет родителя
             */
            if ($settings['show_current']) {
                $text = get_the_title();
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на отдельной странице записи типа «post»
     */
    if (is_single() && get_post_type() == 'post') {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Добавляем в массив ссылку на рубрику и ссылки на всех родителей
         */
        // рубрики, в которых размещена эта запись
        $cat = get_the_category();
        // но мы используем только одну рубрику
        $catID = $cat[0]->cat_ID;
        // получаем всех родителей этой рубрики
        $parents = get_ancestors($catID, 'category');
        $parents = array_reverse( $parents );
        $parents[] = $catID;
        foreach ($parents as $cat) {
            $href = get_category_link($cat);
            $text = get_cat_name($cat);
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Если у записи много комментариев, они будут расположены
         * на нескольких страницах
         */
        if (get_query_var('cpage')) {
            // добавляем в массив ссылку на эту запись
            $href = get_permalink();
            $text = get_the_title();
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница комментариев N»
            $number = get_query_var('cpage');
            $text = 'Страница комментариев '.$number;
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                $text = get_the_title();
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на отдельной странице вложения
     */
    if (is_attachment()) {
        /*
         * Если вложение прикреплено к записи или странице
         */
        if ($parent_id) {
            $parent = get_post($parent_id);
            /*
             * Вложение прикреплено к записи блога
             */
            if ($parent->post_type == 'post') {
                /*
                 * Если последние записи блога показываются не на главной
                 * странице, добавляем в хлебные крошки еще и ссылку на ту
                 * страницу, на которой показываются последние записи
                 */
                // идентификтор страницы, где показываются последние записи
                $page_for_posts = get_option('page_for_posts', 0);
                if ($page_for_posts) {
                    // наименование страницы, где показываются последние записи
                    $title = get_the_title($page_for_posts);
                    // добавляем в массив ссылку на эту страницу
                    $href = get_page_link($page_for_posts);
                    $text = $title;
                    $html = str_replace(
                        ['%HREF%', '%TEXT%'],
                        [$href, $text],
                        $settings['link']
                    );
                    $breadcrumbs[] = $html;
                }
                // рубрики, в которых размещена эта запись
                $cat = get_the_category($parent->ID);
                // но мы используем только одну рубрику
                $catID = $cat[0]->cat_ID;
                // получаем всех родителей этой рубрики
                $parents = get_ancestors($catID, 'category');
                $parents = array_reverse($parents);
                $parents[] = $catID;
                foreach ($parents as $cat) {
                    $href = get_category_link($cat);
                    $text = get_cat_name($cat);
                    $html = str_replace(
                        ['%HREF%', '%TEXT%'],
                        [$href, $text],
                        $settings['link']
                    );
                    $breadcrumbs[] = $html;
                }
                $href = get_permalink($parent);
                $text = $parent->post_title;
                $html = str_replace(
                    ['%HREF%', '%TEXT%'],
                    [$href, $text],
                    $settings['link']
                );
                $breadcrumbs[] = $html;
            }
            /*
             * Вложение прикреплено к статической странице
             */
            if ($parent->post_type == 'page') {
                /*
                 * Если вложение прикреплено к статической странице,
                 * которая показывается на главной странице, тогда
                 * не нужно еще раз добавлять в массив $breadcrumbs
                 * главную страницу
                 */
                if (get_option('page_on_front', 0) != $parent->ID) {
                    $parents = get_post_ancestors($parent->ID);
                    $parents = array_reverse($parents);
                    $parents[] = $parent->ID;
                    foreach ($parents as $id) {
                        $href = get_page_link($id);
                        $text = get_the_title($id);
                        $html = str_replace(
                            ['%HREF%', '%TEXT%'],
                            [$href, $text],
                            $settings['link']
                        );
                        $breadcrumbs[] = $html;
                    }
                }
            }
        }
        if ($settings['show_current']) {
            $text = get_the_title();
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        }
    }
    /*
     * Если мы находимся на странице результатов поиска
     */
    if (is_search()) {
        /*
         * Если это не первая страница результатов поиска (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу, а
         * потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = home_url('/') . '?s=' . get_search_query();
            $text = 'Результаты для «' . get_search_query() . '»';
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                $text = 'Результаты для «' . get_search_query() . '»';
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на странице архива по годам
     */
    if (is_year()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Если это не первая страница архива по годам (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_year_link(get_the_time('Y'));
            $text = get_the_time('Y');
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                // добавляем в массив текст — название года
                $text = get_the_time('Y');
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на странице архива по месяцам
     */
    if (is_month()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        // добавляем в массив ссылку на год публикации
        $href = get_year_link(get_the_time('Y'));
        $text = get_the_time('Y');
        $html = str_replace(
            ['%HREF%', '%TEXT%'],
            [$href, $text],
            $settings['link']
        );
        $breadcrumbs[] = $html;
        /*
         * Если это не первая страница архива по месяцам (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_year_link(get_the_time('F'));
            $text = get_the_time('F');
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                // добавляем в массив текст — название месяца
                $text = get_the_time('F');
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на странице архива по дням
     */
    if (is_day()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        // добавляем в массив ссылку на год публикации
        $href = get_year_link(get_the_time('Y'));
        $text = get_the_time('Y');
        $html = str_replace(
            ['%HREF%', '%TEXT%'],
            [$href, $text],
            $settings['link']
        );
        $breadcrumbs[] = $html;
        // добавляем в массив ссылку на месяц публикации
        $href = get_month_link(
            get_the_time('Y'),
            get_the_time('m')
        );
        $text = get_the_time('F');
        $html = str_replace(
            ['%HREF%', '%TEXT%'],
            [$href, $text],
            $settings['link']
        );
        $breadcrumbs[] = $html;
        /*
         * Если это не первая страница архива по дням (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_day_link(
                get_the_time('Y'),
                get_the_time('m'),
                get_the_time('d')
            );
            $text = get_the_time('d');
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                // добавляем в массив текст — день публикации
                $text = get_the_time('d');
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на странице архива записей с меткой
     */
    if (is_tag()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Если это не первая страница списка записей (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $tagID = get_query_var('tag_id');
            $href = get_tag_link($tagID);
            $text = 'Метка «'.single_tag_title('', false).'»';
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                $text = 'Метка «'.single_tag_title('', false).'»';
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на странице архива записей автора
     */
    if (is_author()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        $author = get_userdata(get_query_var('author'));
        /*
         * Если это не первая страница списка записей (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_author_posts_url($author->ID);
            $text = 'Автор ' . $author->display_name;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            // если это первая страница постраничной навигации
            if ($settings['show_current']) {
                $text = 'Автор ' . $author->display_name;
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }
    /*
     * Если мы находимся на странице 404 Not Found
     */
    if (is_404()) {
        if ($settings['show_current']) {
            $text = 'Страница не найдена';
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        }
    }
    if ($echo) { // выводим хлебные крошки
        if (!empty($breadcrumbs)) {
            $breadcrumbs = implode($settings['separator'], $breadcrumbs);
            echo $settings['wrapper'][0] . $breadcrumbs . $settings['wrapper'][1];
        }
    } else { // возвращаем хлебные крошки
        return $breadcrumbs;
    }

Функция целиком

function echo_breadcrumbs($args = [], $echo = true) {

    /*
     * Настройки хлебных крошек по умолчанию
     */
    $defaults = [
        // обертка для всех элементов хлебных крошек
        'wrapper' => ['<div class="breadcrumbs">', '</div>'],
        // шаблон для элемента хлебных крошек, ссылка
        'link' => '<a href="%HREF%">%TEXT%</a>',
        // шаблон для элемента хлебных крошек, текст
        'text' => '<span class="current">%TEXT%</span>',
        // разделитель для элеменов хлебных крошек
        'separator' => '<span class="separator"> › </span>',
        // показывать хлебные крошки на главной странице?
        'show_on_home' => true,
        // показывать в хлебных крошках текущую страницу?
        'show_current' => false,
    ];

    /*
     * Объединяем настройки по умолчанию и настройки, переданные
     * при вызове функции
     */
    $settings = wp_parse_args($args, $defaults);

    /*
     * В этом массиве будем накапливать все элементы хлебных крошек
     */
    $breadcrumbs = [];

    /*
     * Если это не страница списка записей (рубрика, архив), а отдельная запись
     * (пост, страница, вложение) — получаем ее родителя. Эта переменная нам
     * потребуется несколько раз ниже, поэтому получим ее значение один раз.
     */
    global $post;
    $parent_id = ($post) ? $post->post_parent : false;

    /*
     * Итак, добавляем первый элемент в хлебные крошки
     */
    $href = home_url('/');
    $text = 'Главная';
    $html = str_replace(
        ['%HREF%', '%TEXT%'],
        [$href, $text],
        $settings['link']
    );
    $breadcrumbs[] = $html;

    /*
     * Если мы находимся на главной странице сайта
     */
    if (is_front_page()) {
        /*
         * Здесь возможны две ситуации: когда на главной странице показывается
         * список последних записей блога или когда на главной показывается
         * статическая страница. В случае статической страницы, больше ничего
         * делать не надо, в хлебных крошках всего один элемент.
         */
        // на главной показывается список последних записей
        if (get_query_var('paged')) {
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        }
        // если на главной не надо показывать хлебные крошки,
        // просто очищаем массив $breadcrumbs
        if (!$settings['show_on_home']) {
            $breadcrumbs = [];
        }
    }

    /*
     * Если мы находимся на странице последних записей блога,
     * но это не главная страница
     */
    if (is_home() && !is_front_page()) {
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', false);
        // наименование страницы, где показываются последние записи
        $title = get_the_title($page_for_posts);
        /*
         * Если это не первая страница последних записей (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                $text = $title;
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на странице списка записей рубрики
     */
    if (is_category()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Добавляем в массив ссылки на всех родителей этой рубрики
         */
        $parents = get_ancestors(get_query_var('cat'), 'category');
        foreach (array_reverse($parents) as $cat) {
            $href = get_category_link($cat);
            $text = get_cat_name($cat);
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        if (get_query_var('paged')) {
            /*
             * Если это не первая страница рубрики (постраничная навигация),
             * то сначала добавляем в массив $breadcrumbs ссылку на рубрику,
             * а потом — текст «Страница N»
             */
            // добавляем в массив ссылку на рубрику
            $cat = get_query_var('cat');
            $href = get_category_link($cat);
            $text = get_cat_name($cat);
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            /*
             * Если это первая страница рубрики, просто добавляем
             * в массив $breadcrumbs название рубрики
             */
            if ($settings['show_current']) {
                $text = single_cat_title( '', false );
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на статической странице (тип записи «page»)
     */
    if (is_page() && !is_front_page() && !is_attachment()) {
        if ($parent_id) {
            /*
             * Если у страницы есть родитель
             */
            // получаем всех предков страницы и добавляем в массив
            $parents = get_post_ancestors(get_the_ID());
            foreach (array_reverse($parents) as $id) {
                $href = get_page_link($id);
                $text = get_the_title($id);
                $html = str_replace(
                    ['%HREF%', '%TEXT%'],
                    [$href, $text],
                    $settings['link']
                );
                $breadcrumbs[] = $html;
            }
            if ($settings['show_current']) {
                $text = get_the_title();
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        } else {
            /*
             * Если у страницы нет родителя
             */
            if ($settings['show_current']) {
                $text = get_the_title();
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на отдельной странице записи типа «post»
     */
    if (is_single() && get_post_type() == 'post') {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Добавляем в массив ссылку на рубрику и ссылки на всех родителей
         */
        // рубрики, в которых размещена эта запись
        $cat = get_the_category();
        // но мы используем только одну рубрику
        $catID = $cat[0]->cat_ID;
        // получаем всех родителей этой рубрики
        $parents = get_ancestors($catID, 'category');
        $parents = array_reverse( $parents );
        $parents[] = $catID;
        foreach ($parents as $cat) {
            $href = get_category_link($cat);
            $text = get_cat_name($cat);
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Если у записи много комментариев, они будут расположены
         * на нескольких страницах
         */
        if (get_query_var('cpage')) {
            // добавляем в массив ссылку на эту запись
            $href = get_permalink();
            $text = get_the_title();
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница комментариев N»
            $number = get_query_var('cpage');
            $text = 'Страница комментариев '.$number;
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                $text = get_the_title();
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на отдельной странице вложения
     */
    if (is_attachment()) {
        /*
         * Если вложение прикреплено к записи или странице
         */
        if ($parent_id) {
            $parent = get_post($parent_id);
            /*
             * Вложение прикреплено к записи блога
             */
            if ($parent->post_type == 'post') {
                /*
                 * Если последние записи блога показываются не на главной
                 * странице, добавляем в хлебные крошки еще и ссылку на ту
                 * страницу, на которой показываются последние записи
                 */
                // идентификтор страницы, где показываются последние записи
                $page_for_posts = get_option('page_for_posts', 0);
                if ($page_for_posts) {
                    // наименование страницы, где показываются последние записи
                    $title = get_the_title($page_for_posts);
                    // добавляем в массив ссылку на эту страницу
                    $href = get_page_link($page_for_posts);
                    $text = $title;
                    $html = str_replace(
                        ['%HREF%', '%TEXT%'],
                        [$href, $text],
                        $settings['link']
                    );
                    $breadcrumbs[] = $html;
                }
                // рубрики, в которых размещена эта запись
                $cat = get_the_category($parent->ID);
                // но мы используем только одну рубрику
                $catID = $cat[0]->cat_ID;
                // получаем всех родителей этой рубрики
                $parents = get_ancestors($catID, 'category');
                $parents = array_reverse($parents);
                $parents[] = $catID;
                foreach ($parents as $cat) {
                    $href = get_category_link($cat);
                    $text = get_cat_name($cat);
                    $html = str_replace(
                        ['%HREF%', '%TEXT%'],
                        [$href, $text],
                        $settings['link']
                    );
                    $breadcrumbs[] = $html;
                }
                $href = get_permalink($parent);
                $text = $parent->post_title;
                $html = str_replace(
                    ['%HREF%', '%TEXT%'],
                    [$href, $text],
                    $settings['link']
                );
                $breadcrumbs[] = $html;
            }
            /*
             * Вложение прикреплено к статической странице
             */
            if ($parent->post_type == 'page') {
                /*
                 * Если вложение прикреплено к статической странице,
                 * которая показывается на главной странице, тогда
                 * не нужно еще раз добавлять в массив $breadcrumbs
                 * главную страницу
                 */
                if (get_option('page_on_front', 0) != $parent->ID) {
                    $parents = get_post_ancestors($parent->ID);
                    $parents = array_reverse($parents);
                    $parents[] = $parent->ID;
                    foreach ($parents as $id) {
                        $href = get_page_link($id);
                        $text = get_the_title($id);
                        $html = str_replace(
                            ['%HREF%', '%TEXT%'],
                            [$href, $text],
                            $settings['link']
                        );
                        $breadcrumbs[] = $html;
                    }
                }
            }
        }
        if ($settings['show_current']) {
            $text = get_the_title();
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        }
    }

    /*
     * Если мы находимся на странице результатов поиска
     */
    if (is_search()) {
        /*
         * Если это не первая страница результатов поиска (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу, а
         * потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = home_url('/') . '?s=' . get_search_query();
            $text = 'Результаты для «' . get_search_query() . '»';
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                $text = 'Результаты для «' . get_search_query() . '»';
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на странице архива по годам
     */
    if (is_year()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Если это не первая страница архива по годам (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_year_link(get_the_time('Y'));
            $text = get_the_time('Y');
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                // добавляем в массив текст — название года
                $text = get_the_time('Y');
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на странице архива по месяцам
     */
    if (is_month()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        // добавляем в массив ссылку на год публикации
        $href = get_year_link(get_the_time('Y'));
        $text = get_the_time('Y');
        $html = str_replace(
            ['%HREF%', '%TEXT%'],
            [$href, $text],
            $settings['link']
        );
        $breadcrumbs[] = $html;
        /*
         * Если это не первая страница архива по месяцам (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_year_link(get_the_time('F'));
            $text = get_the_time('F');
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                // добавляем в массив текст — название месяца
                $text = get_the_time('F');
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на странице архива по дням
     */
    if (is_day()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        // добавляем в массив ссылку на год публикации
        $href = get_year_link(get_the_time('Y'));
        $text = get_the_time('Y');
        $html = str_replace(
            ['%HREF%', '%TEXT%'],
            [$href, $text],
            $settings['link']
        );
        $breadcrumbs[] = $html;
        // добавляем в массив ссылку на месяц публикации
        $href = get_month_link(
            get_the_time('Y'),
            get_the_time('m')
        );
        $text = get_the_time('F');
        $html = str_replace(
            ['%HREF%', '%TEXT%'],
            [$href, $text],
            $settings['link']
        );
        $breadcrumbs[] = $html;
        /*
         * Если это не первая страница архива по дням (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_day_link(
                get_the_time('Y'),
                get_the_time('m'),
                get_the_time('d')
            );
            $text = get_the_time('d');
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                // добавляем в массив текст — день публикации
                $text = get_the_time('d');
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на странице архива записей с меткой
     */
    if (is_tag()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        /*
         * Если это не первая страница списка записей (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $tagID = get_query_var('tag_id');
            $href = get_tag_link($tagID);
            $text = 'Метка «'.single_tag_title('', false).'»';
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            if ($settings['show_current']) {
                $text = 'Метка «'.single_tag_title('', false).'»';
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на странице архива записей автора
     */
    if (is_author()) {
        /*
         * Если последние записи блога показываются не на главной
         * странице, добавляем в хлебные крошки еще и ссылку на ту
         * страницу, на которой показываются последние записи
         */
        // идентификтор страницы, где показываются последние записи
        $page_for_posts = get_option('page_for_posts', 0);
        if ($page_for_posts) {
            // наименование страницы, где показываются последние записи
            $title = get_the_title($page_for_posts);
            // добавляем в массив ссылку на эту страницу
            $href = get_page_link($page_for_posts);
            $text = $title;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
        }
        $author = get_userdata(get_query_var('author'));
        /*
         * Если это не первая страница списка записей (постраничная навигация),
         * то сначала добавляем в массив $breadcrumbs ссылку на первую страницу,
         * а потом — текст «Страница N»
         */
        if (get_query_var('paged')) {
            // добавляем в массив ссылку на первую страницу
            $href = get_author_posts_url($author->ID);
            $text = 'Автор ' . $author->display_name;
            $html = str_replace(
                ['%HREF%', '%TEXT%'],
                [$href, $text],
                $settings['link']
            );
            $breadcrumbs[] = $html;
            // добавляем в массив текст «Страница N»
            $text = 'Страница ' . get_query_var('paged');
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        } else {
            // если это первая страница постраничной навигации
            if ($settings['show_current']) {
                $text = 'Автор ' . $author->display_name;
                $html = str_replace('%TEXT%', $text, $settings['text']);
                $breadcrumbs[] = $html;
            }
        }
    }

    /*
     * Если мы находимся на странице 404 Not Found
     */
    if (is_404()) {
        if ($settings['show_current']) {
            $text = 'Страница не найдена';
            $html = str_replace('%TEXT%', $text, $settings['text']);
            $breadcrumbs[] = $html;
        }
    }

    if ($echo) { // выводим хлебные крошки
        if (!empty($breadcrumbs)) {
            $breadcrumbs = implode($settings['separator'], $breadcrumbs);
            echo $settings['wrapper'][0] . $breadcrumbs . $settings['wrapper'][1];
        }
    } else { // возвращаем хлебные крошки
        return $breadcrumbs;
    }

}

Пример вызова

При использовании фреймворка Bootstrap 3, уже есть готовый css-класс breadcrumb, позволяющий получить красиво оформленные хлебные крошки:

<ol class="breadcrumb">
    <li><a href="#">Главная</a></li>
    <li><a href="#">Процессоры</a></li>
    <li class="active">Intel</li>
</ol>

Используем этот css-класс при вызове функции:

echo_breadcrumbs([
    'wrapper' => ['<ol class="breadcrumb">', '</ol>'],
    'link' => '<li><a href="%HREF%">%TEXT%</a></li>',
    'text' => '<li class="active">%TEXT%</li>',
    'separator' => '',
    'show_current' => true,
]);

Поиск: CMS • Web-разработка • WordPress • Навигация • Функция • Хлебные крошки • Breadcrumbs

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.