WordPress的菜单功能很好用,在外观->菜单下用户可以随意创建菜单,并将创建的菜单指定到某个菜单位置显示。如果我们想跳过菜单位置的选择,直接显示菜单怎么办呢?最近需要写一个ET Builder的菜单工具,研究了一下WordPress默认小工具“自定义菜单”(Custom Menu Widget)的写法。
获取用户创建的菜单
通过下面的代码可以获取用户在后台创建的所有菜单,将代码放在functions.php中访问站点即可看到。$menus = get_terms('nav_menu');
foreach( $menus as $menu ){
echo '
'; var_export($menu); echo '';
}
上面的代码可以得到类似下面这样的结果stdClass::__set_state(array(
'term_id' => '9',
'name' => 'Footer menu',
'slug' => 'footer-menu',
'term_group' => '0',
'term_taxonomy_id' => '9',
'taxonomy' => 'nav_menu',
'description' => '',
'parent' => '0',
'count' => '5',
))
由此看出,通过$menu变量可以获取菜单的名称、slug、描述等等信息,例如用select显示所有菜单,供用户选择,类似custom menu工具。$menus = get_terms('nav_menu');
echo '';
foreach ($menus as $menu) {
echo '' . $menu->name . '';
}
echo '';
显示菜单
用程序的方法显示菜单,需要知道菜单的名字或者id,假设知道菜单名称,则显示菜单的代码如下$menu = 'Footer menu';
$nav_menu = wp_get_nav_menu_object($menu);
wp_nav_menu( array( 'fallback_cb' => '', 'menu' => $nav_menu ));
用wp_get_nav_menu_object获取代表菜单的对象
通过menu参数将这个对象传递给wp_nav_menu函数,表示要显示的是这个名为“Footer menu”的菜单
fallback_cb参数设为空,因为我们直接调用了某个已经创建的菜单,所以不需要fallback函数(即该menu不存在时要调用的函数,默认是wp_page_menu)
wp_get_nav_menu_object用法<?php wp_get_nav_menu_object( $menu ); ?>
$menu: 可以是菜单的名称id、slug或name
返回值:找到菜单则返回menu object,否则返回false