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

11条留言

  1. 博主 可以使用上边的方法
    直接调用菜单ID么
    menu-item-10 调用10这个数值
    或者有什么方法可以直接调用菜单ID

    1. menu-item-10是菜单中某一项的ID,而菜单ID是某个菜单的ID

      后者用wp_get_nav_menu_object或者wp_get_nav_menu_items获取,其参数可以是菜单的名称id、slug或name

      如果一定要通过某个菜单项的ID找到这个菜单项,据我了解WordPress没这种函数,你可以用上面的函数获取所有菜单项,然后遍历一下。

      1. 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’的值
        麻烦指点

        1. 你要检查一下$menu_item->ID是否有输出正确的值,如果没有,检查update_post_meta函数是否把信息保存到数据库了。

          1. 感谢博主大虾的回复
            我已经被我自己想实现的效果给折腾晕了
            博主的评论不能上传图片
            能否加博主QQ或告知邮箱

    2. 真是抱歉,我不用qq,也太多时间回复邮件咨询。希望你能用第三方的服务来发图片,例如http://postimage.org/,大部分wordpress博客都不会开放图片上传的。

  2. 请问博主,我在function注册了一个菜单位置“header-menu1”,然后我在后台创建了一个名称为“导航菜单”,这个菜单位置是放在在“header-menu1”中的,在前台要怎么输出菜单名称(输出“导航菜单”这四个字)呢?

    1. 如果要自动输出的话,看看wp_get_nav_menus()函数
      如果是自用建议怎么简单怎么来,直接写进去也未尝不可。

      1. 嗯,很麻烦,所以还是算了,默认菜单就好。

  3. 看不明白这个可以做什么

    1. 写跟菜单有关的插件时可以用用

评论功能已关闭