【问题标题】:WordPress wp_nav_menu specific sub menu only仅 WordPress wp_nav_menu 特定子菜单
【发布时间】:2012-07-06 11:53:47
【问题描述】:

我想创建一个菜单,只为特定页面提取子菜单选项。

例如,如果菜单选项 DASHBOARD 具有子菜单 MESSAGE BOARD 和 CALENDAR,我希望能够创建一个仅包含 MESSAGE BOARD 和 CALENDAR 的单独菜单。

我想在没有 wp_list_pages 功能的情况下执行此操作,以便可以使用 WordPress 中的“外观”>“菜单”选项卡来管理菜单选项。

谢谢!

【问题讨论】:

    标签: wordpress menu


    【解决方案1】:

    如果我的理解正确,您想要子页面的其他菜单项吗?

    I.E.你有一个看起来像这样的菜单

    首页 关于 DASHBOARD 常见问题 联系方式

    DASHBOARD 有 2 个子页面 -> BOARD CALENDAR

    当您在 DASHBOARD 页面上时,您希望 BOARD 和 CALENDAR 页面显示如下:

    首页 关于 DASHBOAR 常见问题 联系方式 董事会日历

    你可以像这样在functions.php中添加一个额外的菜单

    <?php if (function_exists('register_nav_menus'))
    {
        register_nav_menus
        (
            array
            (
                'main_nav'=>'main menu', // your main menu
                'dash_nav'=>'dashboard menu', //your dashboard menu
    
            )
        );
    }?>
    

    然后为仪表板创建一个页面模板,其中包含:

    <?php wp_nav_menu(array('menu'=>'dashboard menu'));?>
    

    编辑:

    你可以编辑 header.php 并添加类似这样的内容

    <?php if (is_page_template('dashboard.php') :?>
        <link href="csspath" rel="stylesheet" type="text/css" />
    <?php endif;?>
    

    这样您就可以添加另一个覆盖子菜单的 css 文件。

    【讨论】:

    • 在这种情况下,我试图限制我必须注册的菜单数量,因此我希望从现有菜单中获得更多功能。由于菜单的结构已经作为子菜单存在,我想知道是否有办法利用它。
    【解决方案2】:

    我想我和您有类似的愿望,即选择并仅显示一个子菜单,该子菜单只是现有 wordpress 菜单中的子菜单项。这可以通过编辑 functions.php 并添加一个具有自己的 walker 类的短代码来定位和显示子菜单来完成。

    “menu”短代码和自定义菜单walker类的PHP代码(全部在functions.php中):

        //register menu shortcode
        add_shortcode('menu', 'shortcode_menu');
        function shortcode_menu($args ) {
                //don't echo the ouput so we can return it
                $args['echo']=false;
                //in case menu isn't found display a message
                $args['fallback_cb']='shortcode_menu_fallback';
                //check if showing a submenu, if so make sure everything is setup to do so
                if (isset($args['show_submenu']) && !empty($args['show_submenu'])) {
                        if (!isset($args['depth'])) {
                                $args['depth']=1;
                        }
                        $args['walker']=new Sub_Menu_Walker_Nav_Menu();
                }
                $menu=wp_nav_menu( $args );
                return $menu;
        }
        //message to display if menu isn't found
        function shortcode_menu_fallback($args ) {return 'No menu selected.';}
    
        //special walker_nav_menu class to only display submenu
        //depth must be greater than 0
        //show_submenu specifies submenu to display
        class Sub_Menu_Walker_Nav_Menu extends Walker_Nav_Menu {
        function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {
          if ( !$element )
           return;
    
          $id_field = $this->db_fields['id'];
    
          $displaythiselement=$depth!=0;
          if ($displaythiselement) {
                  //display this element
                  if ( is_array( $args[0] ) )
                   $args[0]['has_children'] = ! empty( $children_elements[$element->$id_field] );
                  $cb_args = array_merge( array(&$output, $element, $depth), $args);
                  call_user_func_array(array(&$this, 'start_el'), $cb_args);
          }
    
          $id = $element->$id_field;
          if ( is_array( $args[0] ) ){
                $show_submenu=$args[0]['show_submenu'];
          }else
                $show_submenu=$args[0]->show_submenu;
    
          // descend only when the depth is right and there are childrens for this element
          if ( ($max_depth == 0 || $max_depth >= $depth+1 ) && isset( $children_elements[$id]) && $element->title==$show_submenu) {
    
           foreach( $children_elements[ $id ] as $child ){
    
            if ( !isset($newlevel) ) {
             $newlevel = true;
             //start the child delimiter
             $cb_args = array_merge( array(&$output, $depth), $args);
             call_user_func_array(array(&$this, 'start_lvl'), $cb_args);
            }
            $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
           }
           unset( $children_elements[ $id ] );
          }
    
          if ( isset($newlevel) && $newlevel ){
           //end the child delimiter
           $cb_args = array_merge( array(&$output, $depth), $args);
           call_user_func_array(array(&$this, 'end_lvl'), $cb_args);
          }
    
          if ($displaythiselement) {
                  //end this element
                  $cb_args = array_merge( array(&$output, $element, $depth), $args);
                  call_user_func_array(array(&$this, 'end_el'), $cb_args);
          }
         }
        }
    

    从“主”菜单显示一个标题为“关于”的子菜单(大写很重要):

    [menu menu='Main' show_submenu='About']
    

    显示完整的“主”菜单:

    [menu menu='Main']
    

    如需进一步阅读/参考,请参阅this wordpress question

    【讨论】:

      【解决方案3】:

      我很惊讶 Wordpress 没有在 wp_nav_menu 函数中内置这个选项。在 Wordpress 中实现二级菜单或拆分菜单一直很困难。在尝试了许多不同的解决方案来实现这个目标之后,我最终决定制作自己的插件,让您可以选择菜单的开始深度。因此,您可以将二级菜单的起始深度设置为“1”。

      你像这样使用插件:

      wp_nav_plus(array('theme_location' => 'primary_navigation', 'start_depth' => 1));
      

      任何有兴趣的人都可以在我的网站上使用该插件:https://mattkeys.me/products/wp-nav-plus/

      【讨论】:

      • 我是插件开发的忠实粉丝,我很欣赏您在扩展 Wordpress 框架方面所做的努力。但是,您的“答案”对本主题没有任何帮助,并且对除您自己以外的任何人都没有帮助。
      • 是的,这很公平。在我真正理解 stackoverflow 之前,我不久前写了这个评论。值得一提的是,我当时写的插件是开源的,如果有人想通过代码来了解它是如何工作的,或者根据他们的需要重新调整它的用途。该代码比我认为我可以根据stackoverflow标准总结为这个问题的“答案”更复杂。 wordpress.org/plugins/wp-nav-plus
      猜你喜欢
      • 2014-08-26
      • 2019-10-29
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 2011-06-29
      • 2018-09-04
      • 2011-12-28
      相关资源
      最近更新 更多