You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress面包屑导航点击当前菜单时未显示父菜单求助

修复WordPress面包屑导航不显示父菜单的问题

看起来你遇到的核心问题是当前的dimox_breadcrumbs()函数没有处理页面(Page)类型的层级关系——它只覆盖了分类、文章、搜索等场景,但漏掉了页面(尤其是子页面)的父级菜单/页面展示逻辑,导致点击子菜单时无法显示父菜单。

下面是修复后的完整函数,我补充了页面类型的处理逻辑,同时保留了你原有的所有配置项,确保能输出Home >> 父菜单名称 >> 子菜单名称的预期格式:

function dimox_breadcrumbs() {
    /* === OPTIONS === */
    $text['home'] = 'Home'; // text for the 'Home' link
    $text['category'] = 'Archive by Category "%s"'; // text for a category page
    $text['search'] = 'Search Results for "%s" Query'; // text for a search results page
    $text['tag'] = 'Posts Tagged "%s"'; // text for a tag page
    $text['author'] = 'Articles Posted by %s'; // text for an author page
    $text['404'] = 'Error 404'; // text for the 404 page
    $text['page'] = 'Page %s'; // text 'Page N'
    $text['cpage'] = 'Comment Page %s'; // text 'Comment Page N'
    $wrap_before = '<div class="breadcrumbs" itemscope itemtype="http://schema.org/BreadcrumbList">'; // the opening wrapper tag
    $wrap_after = '</div><!-- .breadcrumbs -->'; // the closing wrapper tag
    $sep = '›'; // separator between crumbs
    $sep_before = '<span class="sep">'; // tag before separator
    $sep_after = '</span>'; // tag after separator
    $show_home_link = 1; // 1 - show the 'Home' link, 0 - don't show
    $show_on_home = 0; // 1 - show breadcrumbs on the homepage, 0 - don't show
    $show_current = 1; // 1 - show current page title, 0 - don't show
    $before = '<span class="current">'; // tag before the current crumb
    $after = '</span>'; // tag after the current crumb
    /* === END OF OPTIONS === */

    global $post;
    $home_url = home_url('/');
    $link_before = '<span itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">';
    $link_after = '</span>';
    $link_attr = ' itemprop="item"';
    $link_in_before = '<span itemprop="name">';
    $link_in_after = '</span>';
    $link = $link_before . '<a href="%1$s"' . $link_attr . '>' . $link_in_before . '%2$s' . $link_in_after . '</a>' . $link_after;
    $frontpage_id = get_option('page_on_front');
    $parent_id = ($post) ? $post->post_parent : '';
    $sep = ' ' . $sep_before . $sep . $sep_after . ' ';
    $home_link = $link_before . '<a href="' . $home_url . '"' . $link_attr . ' class="home">' . $link_in_before . $text['home'] . $link_in_after . '</a>' . $link_after;

    if (is_home() || is_front_page()) {
        if ($show_on_home) echo $wrap_before . $home_link . $wrap_after;
    } else {
        echo $wrap_before;
        if ($show_home_link) echo $home_link;

        // 新增:处理页面(Page)的面包屑层级
        if (is_page() && !is_front_page()) {
            if ($show_home_link) echo $sep;
            
            // 递归获取所有父页面
            $parents = array();
            $current_page = $post;
            while ($current_page->post_parent) {
                $current_page = get_post($current_page->post_parent);
                array_unshift($parents, $current_page);
            }
            
            // 输出父页面链接
            foreach ($parents as $parent) {
                printf($link, get_permalink($parent->ID), get_the_title($parent->ID));
                echo $sep;
            }
            
            // 输出当前页面
            if ($show_current) echo $before . get_the_title() . $after;
        }
        // 原有的分类处理逻辑
        elseif ( is_category() ) {
            $cat = get_category(get_query_var('cat'), false);
            if ($cat->parent != 0) {
                $cats = get_category_parents($cat->parent, TRUE, $sep);
                $cats = preg_replace("#^(.+)$sep$#", "$1", $cats);
                $cats = preg_replace('#<a([^>]+)>([^<]+)</a>#', $link_before . '<a$1' . $link_attr .'>' . $link_in_before . '$2' . $link_in_after .'</a>' . $link_after, $cats);
                if ($show_home_link) echo $sep;
                echo $cats;
            }
            if ( get_query_var('paged') ) {
                $cat = $cat->cat_ID;
                echo $sep . sprintf($link, get_category_link($cat), get_cat_name($cat)) . $sep . $before . sprintf($text['page'], get_query_var('paged')) . $after;
            } else {
                if ($show_current) echo $sep . $before . sprintf($text['category'], single_cat_title('', false)) . $after;
            }
        }
        // 原有的搜索处理逻辑
        elseif ( is_search() ) {
            if (have_posts()) {
                if ($show_home_link && $show_current) echo $sep;
                if ($show_current) echo $before . sprintf($text['search'], get_search_query()) . $after;
            } else {
                if ($show_home_link) echo $sep;
                echo $before . sprintf($text['search'], get_search_query()) . $after;
            }
        }
        // 原有的日期归档处理逻辑
        elseif ( is_day() ) {
            if ($show_home_link) echo $sep;
            echo sprintf($link, get_year_link(get_the_time('Y')), get_the_time('Y')) . $sep;
            echo sprintf($link, get_month_link(get_the_time('Y'), get_the_time('m')), get_the_time('F'));
            if ($show_current) echo $sep . $before . get_the_time('d') . $after;
        } elseif ( is_month() ) {
            if ($show_home_link) echo $sep;
            echo sprintf($link, get_year_link(get_the_time('Y')), get_the_time('Y'));
            if ($show_current) echo $sep . $before . get_the_time('F') . $after;
        } elseif ( is_year() ) {
            if ($show_home_link && $show_current) echo $sep;
            if ($show_current) echo $before . get_the_time('Y') . $after;
        }
        // 原有的文章处理逻辑
        elseif ( is_single() && !is_attachment() ) {
            if ($show_home_link) echo $sep;
            if ( get_post_type() != 'post' ) {
                $post_type = get_post_type_object(get_post_type());
                $slug = $post_type->rewrite;
                printf($link, $home_url . $slug['slug'] . '/', $post_type->labels->singular_name);
                if ($show_current) echo $sep . $before . get_the_title() . $after;
            } else {
                $cat = get_the_category();
                $cat = $cat[0];
                $cats = get_category_parents($cat, TRUE, $sep);
                if (!$show_current || get_query_var('cpage')) $cats = preg_replace("#^(.+)$sep$#", "$1", $cats);
                $cats = preg_replace('#<a([^>]+)>([^<]+)</a>#', $link_before . '<a$1' . $link_attr .'>' . $link_in_before . '$2' . $link_in_after .'</a>' . $link_after, $cats);
                echo $cats;
                if ( get_query_var('cpage') ) {
                    echo $sep . sprintf($link, get_permalink(), get_the_title()) . $sep . $before . sprintf($text['cpage'], get_query_var('cpage')) . $after;
                } else {
                    if ($show_current) echo $sep . $before . get_the_title() . $after;
                }
            }
        }
        // 原有的404处理逻辑
        elseif ( is_404() ) {
            if ($show_home_link) echo $sep;
            echo $before . $text['404'] . $after;
        }
        // 原有的标签处理逻辑
        elseif ( is_tag() ) {
            if ($show_home_link) echo $sep;
            echo $before . sprintf($text['tag'], single_tag_title('', false)) . $after;
            if ( get_query_var('paged') ) {
                echo $sep . sprintf($link, get_tag_link(get_query_var('tag_id')), single_tag_title('', false)) . $sep . $before . sprintf($text['page'], get_query_var('paged')) . $after;
            }
        }
        // 原有的作者归档处理逻辑
        elseif ( is_author() ) {
            global $author;
            $userdata = get_userdata($author);
            if ($show_home_link) echo $sep;
            echo $before . sprintf($text['author'], $userdata->display_name) . $after;
            if ( get_query_var('paged') ) {
                echo $sep . sprintf($link, get_author_posts_url($author), $userdata->display_name) . $sep . $before . sprintf($text['page'], get_query_var('paged')) . $after;
            }
        }
        // 原有的附件处理逻辑
        elseif ( is_attachment() ) {
            if ($show_home_link) echo $sep;
            $parent = get_post($post->post_parent);
            $cat = get_the_category($parent->ID);
            $cat = $cat[0];
            echo get_category_parents($cat, TRUE, $sep);
            printf($link, get_permalink($parent), get_the_title($parent));
            if ($show_current) echo $sep . $before . get_the_title() . $after;
        }
        // 原有的分页处理逻辑
        elseif ( is_paged() ) {
            if ($show_home_link) echo $sep;
            echo $before . sprintf($text['page'], get_query_var('paged')) . $after;
        }

        echo $wrap_after;
    }
}

关键修改说明:

  • 新增了**is_page()的处理分支**:通过递归获取当前页面的所有父页面,按层级依次输出父页面的链接,最后输出当前页面标题,完美匹配你要的层级格式。
  • 完全保留了你原有的配置项和其他场景的处理逻辑,分类、文章、搜索等页面的面包屑功能不受影响。
  • 代码兼容多层父页面(比如Home >> 一级父页面 >> 二级父页面 >> 当前子页面),扩展性更强。

使用方法:

  1. 备份你原有的dimox_breadcrumbs()函数代码。
  2. 把上面的代码替换掉原函数。
  3. 在主题的模板文件(比如header.php)中调用<?php dimox_breadcrumbs(); ?>即可生效。

内容的提问来源于stack exchange,提问作者Akash Rai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:41:56