如何获取WordPress子菜单项的描述?代码问题求助
首先,咱们先明确核心问题:你遇到的子菜单没有description字段,大概率是因为你用到的wp_get_menu_array这个自定义函数,在处理子菜单项的时候,只提取了ID、URL、Title这些常用字段,漏掉了描述属性。
WordPress原生的wp_get_nav_menu_items函数其实是会返回所有菜单项的description属性的,不管是主菜单还是子菜单——所以问题出在这个自定义的数组转换函数上,而不是WordPress本身的菜单数据。
另外先确认一个前提:你在WordPress后台编辑菜单时,有没有开启「描述」输入框?默认情况下这个选项是隐藏的,需要点击右上角的「屏幕选项」,勾选「描述」才能看到输入框,给子菜单项填写描述内容。如果这一步没做,就算代码能获取,后台也没地方填内容,自然是空的。
解决方案1:修改wp_get_menu_array函数
假设你的wp_get_menu_array是常见的自定义实现,大概长这样,你需要在处理子菜单项的地方加上description字段的赋值:
function wp_get_menu_array($menu_name) { $menu = wp_get_nav_menu_object($menu_name); $menu_items = wp_get_nav_menu_items($menu->term_id); $menu_array = array(); foreach ($menu_items as $item) { // 处理主菜单项 if (!$item->menu_item_parent) { $parent = array( 'ID' => $item->ID, 'title' => $item->title, 'url' => $item->url, 'description' => $item->description, // 主菜单已包含 'children' => array() ); $menu_array[] = $parent; } // 处理子菜单项 else { $child = array( 'ID' => $item->ID, 'title' => $item->title, 'url' => $item->url, 'description' => $item->description // 这里加上这一行! ); // 找到对应的父菜单并添加子项 foreach ($menu_array as &$parent) { if ($parent['ID'] == $item->menu_item_parent) { $parent['children'][] = $child; break; } } } } return $menu_array; }
修改后,子菜单项的数组里就会包含description字段,你的原函数get_menu_section_description就能正常获取到子菜单的描述了。
解决方案2:直接用原生函数构建逻辑(无需修改现有函数)
如果不方便修改wp_get_menu_array,可以直接用WordPress原生的wp_get_nav_menu_items来实现你的需求,绕开自定义函数的字段遗漏问题:
function get_menu_section_description($sectionUrl){ $menu = wp_get_nav_menu_object("menu"); $menu_items = wp_get_nav_menu_items($menu->term_id); $desc = ""; foreach ($menu_items as $item) { // 匹配主菜单或子菜单的URL if ($item->url == $sectionUrl) { $desc = $item->description; break; // 找到目标后直接跳出循环 } } return $desc; }
这个方法直接遍历原生返回的菜单项对象,不管是主菜单还是子菜单,description属性都能直接获取到,逻辑更简洁,也避免了自定义函数的潜在问题。
内容的提问来源于stack exchange,提问作者Jordi Vicens

