我们先看下 Bootstrap4 默认的面包屑导航结构

    1. <nav aria-label="breadcrumb">
    2. <ol class="breadcrumb">
    3. <li class="breadcrumb-item">
    4. <a href="#">Home</a>
    5. </li>
    6. <li class="breadcrumb-item">
    7. <a href="#">Library</a>
    8. </li>
    9. <li class="breadcrumb-item active" aria-current="page">Data</li>
    10. </ol>
    11. </nav>

    根据以上结构,我们构建一个函数,并放到 function.php 中。

    <?php
    /**
     * WordPress 适配 Bootstrap4 之 面包屑导航
     * http://www.inli.work/wordpress-adapter-bootstrap4-breadcrumb-navigation.html
     */
    function the_crumbs($before = '<li class="breadcrumb-item">', $delimiter = '</li><li class="breadcrumb-item">', $after = '</li>', $end_delimiter = '</li><li class="breadcrumb-item active" aria-current="page">') {
        // $delimiter = '<span class="mx-1">/</span>'; // 分隔符
        // $before = ''; // 在 当前页 前 插入
        // $after = ''; // 在 当前页 后 插入
        if (!is_home() && !is_front_page() || is_paged()) {
            echo $before;
            global $post;
            $homeLink = home_url();
            echo ' <a title="返回首页" href="' . $homeLink . '">首页</a>';
            if (is_single() && !is_page() && !is_attachment() && get_post_type() != 'post') { // 自定义文章类型
                echo $delimiter;
                $post_type = get_post_type_object(get_post_type());
                $slug = $post_type->rewrite;
                echo '<a href="' . $homeLink . '/' . $slug['slug'] . '/">' . $post_type->labels->singular_name . '</a> '; //自定义文本存档 总归档 写法 2
                $list = '';
                foreach (get_the_taxonomies() as $taxonomy_name => $taxonomy) {
                    /*echo $taxonomy_name;*/
                    if ($taxonomy_name != 'post_tag') {
                        $terms = get_the_terms($post->ID, $taxonomy_name);
                        $term = $terms[0];
                        $parentTerm = get_term($term->parent, $taxonomy_name);
                        if ($term->parent != 0) {
                            $parentTerm_name = $parentTerm->name;
                            $parentTerm_link = get_term_link($parentTerm->term_id, $taxonomy_name);
                            $list.= $delimiter . '<a href="' . esc_url($parentTerm_link) . '">' . $parentTerm_name . '</a> ';
                        }
                        $list.= $delimiter . '<a href="' . esc_url(get_term_link($term->term_id, $taxonomy_name)) . '">' . $term->name . '</a> ' . $delimiter;
                    }
                    /* print_r ($term);*/
                }
                $list = substr($list, 0, -strlen($delimiter)); //移除最后一个 $delimiter
                echo $list;
                echo $end_delimiter . get_the_title();
            } elseif (is_single() && get_post_type() == 'post') { // 文章
                echo $delimiter;
                if (get_option('page_for_posts')) { //设置了文章页
                    echo ' <a href="' . get_post_type_archive_link('post') . '">' . get_post_type_object('post')->labels->singular_name . '</a>' . $delimiter;
                }
                $cat = get_the_category() [0];
                $cat_code = get_category_parents($cat, TRUE, $delimiter);
                $cat_code = substr($cat_code, 0, -strlen($delimiter)); //移除最后一个 $delimiter
                echo $cat_code;
                echo $end_delimiter . get_the_title();
            } elseif (is_attachment()) { // 附件
                echo $delimiter;
                $parent = get_post($post->post_parent);
                $cat = get_the_category($parent->ID) [0];
                $cat_code = get_category_parents($cat, TRUE, $delimiter);
                $cat_code = substr($cat_code, 0, -strlen($delimiter)); //移除最后一个 $delimiter
                echo $cat_code . $delimiter;
                echo '<a href="' . get_permalink($parent) . '">' . $parent->post_title . '</a> ';
                echo $end_delimiter . '附件 - ' . get_the_title();
            } elseif (is_page()) { // 页面
                $parents = get_post_ancestors($post->ID);
                $parents = array_reverse($parents); //以相反的顺序返回数组
                if ($post->post_parent) { // 页面有父级
                    echo $delimiter;
                    $list = '';
                    foreach ($parents as $crumb) {
                        $list.= '<a href="' . get_permalink($crumb) . '">' . get_the_title($crumb) . '</a>' . $delimiter;
                    }
                    $list = substr($list, 0, -strlen($delimiter)); //移除最后一个 $delimiter
                    echo $list;
                }
                echo $end_delimiter . get_the_title();
            } elseif (is_post_type_archive()) { // 自定义文章类型 存档
                echo $end_delimiter;
                $post_type = get_query_var('post_type');
                if (is_array($post_type)) {
                    $post_type = reset($post_type);
                }
                $post_type_object = get_post_type_object($post_type);
                if (!$post_type_object->has_archive) {
                    echo post_type_archive_title('', false);
                } elseif ($post_type_object->has_archive) {
                    echo post_type_archive_title('', false);
                }
            } elseif (is_category()) { // 分类 存档
                if (get_option('page_for_posts')) { //设置了文章页
                    echo $delimiter . ' <a href="' . get_post_type_archive_link('post') . '">' . get_post_type_object('post')->labels->singular_name . '</a>';
                }
                global $wp_query;
                $cat_obj = $wp_query->get_queried_object();
                $thisCat = $cat_obj->term_id;
                $thisCat = get_category($thisCat);
                $parentCat = get_category($thisCat->parent);
                if ($thisCat->parent != 0) {
                    echo $delimiter;
                    $cat_code = get_category_parents($parentCat, TRUE, $delimiter);
                    $cat_code = substr($cat_code, 0, -strlen($delimiter)); //移除最后一个 $delimiter
                    echo $cat_code;
                }
                echo $end_delimiter . single_cat_title('', false);
            } elseif (is_tag()) { //标签 存档
                echo $end_delimiter;
                printf('关于 %s 的所有文章', single_tag_title('', false));
            } elseif (is_tax()) { // 自定义分类 存档
                echo $delimiter;
                echo ' <a href="' . get_post_type_archive_link(get_post_type()) . '">' . get_post_type_object(get_post_type())->labels->singular_name . '</a>'; //自定义文本存档 总归档 写法 1
                global $wp_query;
                $tax_obj = $wp_query->get_queried_object();
                $thisTax = $tax_obj->term_id;
                $thisTaxonomy = $tax_obj->taxonomy;
                $thisTax = get_term($thisTax, $thisTaxonomy);
                $parentTax = get_term($thisTax->parent, $thisTaxonomy);
                if ($thisTax->parent != 0) {
                    echo $delimiter;
                    $tax_code = get_term_parents_list($parentTax, $thisTaxonomy, array('separator' => $delimiter));
                    $tax_code = substr($tax_code, 0, -strlen($delimiter)); //移除最后一个 $delimiter
                    echo $tax_code;
                }
                echo $end_delimiter . single_term_title('', false);
            } elseif (is_author() && !is_post_type_archive()) { // 作者存档
                global $author;
                $userdata = get_userdata($author);
                echo $end_delimiter;
                printf('来自 “%s” 的所有文章', $userdata->display_name);
            } elseif (is_day()) { // 天 存档
                echo $delimiter;
                echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter;
                echo '<a href="' . get_month_link(get_the_time('Y'), get_the_time('m')) . '">' . get_the_time('F') . '</a> ';
                echo $end_delimiter . get_the_time('d');
            } elseif (is_month()) { // 月 存档
                echo $delimiter;
                echo '<a href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ';
                echo $end_delimiter . get_the_time('F');
            } elseif (is_year()) { // 年 存档
                echo $end_delimiter . get_the_time('Y');
            } elseif (is_search()) { // 搜索结果
                echo $end_delimiter;
                printf('您是在搜索 %s 吗?', get_search_query());
            } elseif (is_404()) { // 404 页面
                echo $end_delimiter . '亲,你迷路了!';
            } elseif (!is_single() && !is_page() && get_post_type() != 'post') {
                $post_type = get_post_type_object(get_post_type());
                echo $end_delimiter . $post_type->labels->singular_name;
            }
            // 分页
            if ((get_query_var('paged')) && (is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author())) {
                printf(' - 第 %s 页', get_query_var('paged'));
            }
            echo $after;
        }
    }
    

    最后在需要面包屑导航的地方,引用

    <nav aria-label="breadcrumb">
        <ol class="breadcrumb text-truncate">
            <?php the_crumbs('<li class="breadcrumb-item">', '</li><li class="breadcrumb-item">', '</li>', '</li><li class="breadcrumb-item active" aria-current="page">'); ?>
        </ol>
    </nav>