WordPress的菜单功能很好用,在外观->菜单下用户可以随意创建菜单,并将创建的菜单指定到某个菜单位置显示。如果我们想跳过菜单位置的选择,直接显示菜单怎么办呢?最近需要写一个ET Builder的菜单工具,研究了一下WordPress默认小工具“自定义菜单”(Custom Menu Widget)的写法。
获取用户创建的菜单
通过下面的代码可以获取用户在后台创建的所有菜单,将代码放在functions.php中访问站点即可看到。
$menus = get_terms('nav_menu'); foreach( $menus as $menu ){ echo '<pre>'; var_export($menu); echo '</pre>'; }
上面的代码可以得到类似下面这样的结果
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 '<select name="menulist">'; foreach ($menus as $menu) { echo '<option value="' . $menu->term_id . '">' . $menu->name . '</option>'; } echo '</select>';
显示菜单
用程序的方法显示菜单,需要知道菜单的名字或者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
博主 可以使用上边的方法
直接调用菜单ID么
menu-item-10 调用10这个数值
或者有什么方法可以直接调用菜单ID
menu-item-10是菜单中某一项的ID,而菜单ID是某个菜单的ID
后者用wp_get_nav_menu_object或者wp_get_nav_menu_items获取,其参数可以是菜单的名称id、slug或name
如果一定要通过某个菜单项的ID找到这个菜单项,据我了解WordPress没这种函数,你可以用上面的函数获取所有菜单项,然后遍历一下。
http://www.ashuwp.com/courses/highgrade/468.html#comment-243643
这个教程最后的调用代码get_post_meta( $menu_item->ID, ‘_menu_item_ashuwp’, true ); 不能正确的显示 我将 $menu_item->ID改成固定的数值
get_post_meta( 10, ‘_menu_item_ashuwp’, true );
这样能正确的显示 这样调用所有的菜单都显示’_menu_item_ashuwp’的值
我想弄成get_post_meta( 根据菜单某一项的ID, ‘_menu_item_ashuwp’, true );
来显示’_menu_item_ashuwp’的值
麻烦指点
你要检查一下$menu_item->ID是否有输出正确的值,如果没有,检查update_post_meta函数是否把信息保存到数据库了。
感谢博主大虾的回复
我已经被我自己想实现的效果给折腾晕了
博主的评论不能上传图片
能否加博主QQ或告知邮箱
真是抱歉,我不用qq,也太多时间回复邮件咨询。希望你能用第三方的服务来发图片,例如http://postimage.org/,大部分wordpress博客都不会开放图片上传的。
请问博主,我在function注册了一个菜单位置“header-menu1”,然后我在后台创建了一个名称为“导航菜单”,这个菜单位置是放在在“header-menu1”中的,在前台要怎么输出菜单名称(输出“导航菜单”这四个字)呢?
如果要自动输出的话,看看wp_get_nav_menus()函数
如果是自用建议怎么简单怎么来,直接写进去也未尝不可。
嗯,很麻烦,所以还是算了,默认菜单就好。
看不明白这个可以做什么
写跟菜单有关的插件时可以用用