wp_nav_menu walker 类子菜单仅显示在父页面上

Posted

技术标签:

【中文标题】wp_nav_menu walker 类子菜单仅显示在父页面上【英文标题】:wp_nav_menu walker class submenu display only on parent page 【发布时间】:2011-12-28 17:46:05 【问题描述】:

我已搜索并找不到自定义“Walker”类,该类将隐藏 wp_nav_menu 中的子菜单,直到您位于父页面上。我找到了很多隐藏它们或仅显示子菜单的方法,但不是仅在您处于该部分时才显示子菜单的方法。下面是我需要它如何显示的示例:

当前的 Wp_nav_menu 结构:

父 1 父 2 孩子 1 孩子 2 父 3 孩子A 孩子B

-显示-

在父 1/主页上:

父 1 父 2 父 3

在 Parent 2 和 Parent 2 子页面上:

父 1 父 2 孩子 1 孩子 2 父 3

【问题讨论】:

您可能会在 wordpress.stackexchange.com 上获得更好的答案,您希望我们为您迁移吗? 【参考方案1】:

您不需要自定义 walker 来执行此操作,可以使用 CSS 类和 display:none 来完成;

例如你可以从:

.menu .sub-menu  display: none; 
.menu .current-menu-item .sub-menu  display:block; 
.menu .current-menu-ancestor .sub-menu  display:block; 

通过一些额外的规则,基于应用于 body 标签的类,您可以有条件地显示和隐藏其他菜单项,使用通过后端添加到菜单项的类。

【讨论】:

非常感谢 - 我真的看不到树木的树木。【参考方案2】:

在我看来,使用 CSS 来“隐藏”不需要的菜单级别充其量是繁琐的,最坏的情况是有点“hacky”。就我个人而言,我从不喜欢向页面输出不应该存在的任何内容(无论如何都可以避免)。

Wordpress 目前对我们没有任何帮助,因为它们没有提供内置于 wp_nav_menu 的选项来限制菜单的起始深度。

我尝试了不同的walker、小部件和插件来解决这个问题,但我对我尝试过的解决方案从来都不是很满意。例如,上面插件中的解决方案要求您传递所需子菜单的 ID。

我已经编写了自己的插件,它扩展了 wp_nav_menu 以添加“start_depth”选项。这会自动在任何子页面上运行,无需指定任何内容。

安装插件后使用这样的代码即可:

wp_nav_plus(array('theme_location' => 'primary_navigation', 'start_depth' => 1));

任何有兴趣的人都可以在我的网站上找到它:https://mattkeys.me/products/wp-nav-plus/

【讨论】:

【参考方案3】:

上面的答案是正确的——你可以用 css 做到这一点,但菜单在技术上仍然“存在”。如果你想完全消除 - 你可以使用我写的插件 - here。

请评价并确认它有效 - 我几天前刚刚发布了它。我已经在几个网站上使用过它。我的第一个插件:)

【讨论】:

插件效果很好!如果它能够弄清楚它在菜单树本身的位置会很好 - 目前你可以通过它 $post->post_parent 来获得正确的子菜单,但这有问题:如果你的页面结构不同于你的菜单结构,你会得到错误的子菜单显示。不过,有用的开始非常感谢!

以上是关于wp_nav_menu walker 类子菜单仅显示在父页面上的主要内容,如果未能解决你的问题,请参考以下文章

将特色图像添加到 wp_nav_menu 项目

如何在函数中定位特定的 wordpress 菜单(wp_nav_menu)?

PHP 使用wp_nav_menu向菜单添加说明

将 div 插入 wp_nav_menu

Wordpress 3.5 - 如何仅使用 wp_nav_menu 显示父级的子菜单?

text wp_nav_menu中的菜单start_level参数