我想创建一个walker函数,或者以某种方式修改当前函数wp_nav_menus
因此,它可以生成自定义输出。让我们想象一下这种结构:
menu item 1
menu item 2
submenu item a
submenu item b
menu item 3
submenu item c
submenu item d
submenu item e
最简单的部分是只在一个地方显示主菜单项(主菜单1、2、3),可以使用wp\\u nav\\u菜单完成,因此我们不需要对其进行编码。
问题是在其他地方显示当前主项的子菜单项。。。所以,如果用户在“菜单项1”页面上,则不会显示任何内容。如果用户位于“菜单项2”页面,我们的“新”自定义菜单将显示:
submenu item a
submenu item b
当用户位于上述两个页面(菜单项)中的任何一个页面上时,会呈现相同的菜单项。
当用户单击“菜单项3”并访问其目标页面时,他会看到子菜单项c、d、e,与单击任何子菜单项后看到的子菜单项相同。
如果菜单有第三级元素(以及更深层次的元素),自定义菜单应显示当前最顶层菜单元素的所有子元素,以及顶层元素本身(将列在第一位描述的站点顶部)
有没有办法创建这样的功能?
该想法接近于:Display a portion/branch of menu只是它需要是动态的,并显示当前菜单分支的子元素/顶部菜单分支元素的所有子元素(如果存在)。
好吧,我不能用get_ancestors
, 因为它只适用于层次分类法,这里我们讨论的不是从帖子/页面层次结构创建的菜单,而是使用菜单编辑器。
SOLVED:似乎我能够通过几种方法创建正确的函数:
/**
* The API function, just a wrap for wp_nav_menu adding filter first and removing after
*/
function filtered_nav_menu( $args = array() ) {
$echo = isset($args[\'echo\']) ? (bool)$args[\'echo\'] : true;
$args[\'echo\'] = false;
add_filter( \'wp_nav_menu_objects\', \'gmfnv_filter\', 999 );
$menu = wp_nav_menu( $args );
remove_filter( \'wp_nav_menu_objects\', \'gmfnv_filter\', 999 );
if ( $echo ) echo $menu;
else return $menu;
}
/**
* The filter callback, return the filtered elements
*/
function gmfnv_filter( $items ) {
$found_top_parent_ID = false;
foreach ($items as $item) {
if ( ($item->menu_item_parent == 0 && $item->current_item_ancestor == 1) || ($item->menu_item_parent == 0 && $item->current == 1) ) {
$found_top_parent_ID = $item->ID;
}
}
$children = submenu_get_children_ids( $found_top_parent_ID, $items );
foreach ( $items as $key => $item ) {
if ( ! in_array( $item->ID, $children ) )
unset($items[$key]);
}
return $items;
}
/**
* Helper function: return children of an element using wp_filter_object_list
*/
function submenu_get_children_ids( $id, $items ) {
$ids = wp_filter_object_list( $items, array( \'menu_item_parent\' => $id ), \'and\', \'ID\' );
foreach ( $ids as $id ) {
$ids = array_merge( $ids, submenu_get_children_ids( $id, $items ) );
}
return $ids;
}
它的作用-它通过遍历每个$items元素并检查以下各项来搜索当前的分支顶部祖先:
($item->menu_item_parent == 0 && $item->current_item_ancestor == 1) || ($item->menu_item_parent == 0 && $item->current == 1)
这个条件必须由两部分组成,因为顶级菜单元素也可能是当前元素。
如果找到顶级$项,则函数submenu_get_children_ids
用于列出其所有子元素。