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 >> 一级父页面 >> 二级父页面 >> 当前子页面),扩展性更强。
使用方法:
- 备份你原有的
dimox_breadcrumbs()函数代码。 - 把上面的代码替换掉原函数。
- 在主题的模板文件(比如
header.php)中调用<?php dimox_breadcrumbs(); ?>即可生效。
内容的提问来源于stack exchange,提问作者Akash Rai
相关产品推荐
相关产品推荐

