Comment utiliser wp_nav_menu pour créer une liste déroulante de menu de sélection?


21

J'utilise ce qui suit à l'intérieur de la wp_nav_menufonction pour créer un menu déroulant de sélection où chaque élément de menu est une option dans la liste déroulante de sélection ...

'items_wrap' => '<select>%3$s</select>'
'before'     => '<option value="">'
'after'      => '</option>'

Comment ajouter la valeur du lien dans la 'before'déclaration? Y a-t-il une meilleure façon de procéder? Je sais wp_dropdown_pages, mais cela ne fonctionne pas parce que je veux que les utilisateurs puissent contrôler le menu à partir de la page "Menus".

Réponses:


25

Vous ne pouvez pas le faire avec wp_nav_menu, car il génère des éléments de liste et vous générerez un balisage non valide avec votre code.

Essayez plutôt d' utiliser wp_get_nav_menu_items () .


Une solution rapide pour un menu déroulant avec un déambulateur personnalisé:

class Walker_Nav_Menu_Dropdown extends Walker_Nav_Menu{

    // don't output children opening tag (`<ul>`)
    public function start_lvl(&$output, $depth){}

    // don't output children closing tag    
    public function end_lvl(&$output, $depth){}

    public function start_el(&$output, $item, $depth, $args){

      // add spacing to the title based on the current depth
      $item->title = str_repeat("&nbsp;", $depth * 4) . $item->title;

      // call the prototype and replace the <li> tag
      // from the generated markup...
      parent::start_el(&$output, $item, $depth, $args);
      $output = str_replace('<li', '<option', $output);
    }

    // replace closing </li> with the closing option tag
    public function end_el(&$output, $item, $depth){
      $output .= "</option>\n";
    }
}

Dans vos modèles, utilisez-le comme ceci:

wp_nav_menu(array(
  'theme_location' => 'primary', // your theme location here
  'walker'         => new Walker_Nav_Menu_Dropdown(),
  'items_wrap'     => '<select>%3$s</select>',
));

1
En fait, lorsque vous utilisez la partie "items_wrap", cela supprime les éléments de la liste, donc le balisage est correct. Je vais vérifier le lien cependant. Merci!
Chris Molitor

oui, mais cela ne gère pas les <UL>s imbriqués :)
onetrickpony

En fait :-)
Chris Molitor

1
Selon la source, ce n'est pas le cas, sauf si vous utilisez un déambulateur personnalisé ...
onetrickpony

Est-ce que ça marche ou pas?
chrisjlee

0

J'ai trouvé cela utile:

Vous pouvez suivre toutes les réponses pour simplifier le menu dropdovn du code CSS.

  1. Ajouter une classe parentpour les éléments qui ont un sous-menu
  2. ajouter une depthclasse (depth0, depth1, depth2 ...)

ajouter à function.php votre thème

class DD_Wolker_Menu extends Walker_Nav_Menu {
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ){
        $GLOBALS['dd_children'] = ( isset($children_elements[$element->ID]) )? 1:0;
        $GLOBALS['dd_depth'] = (int) $depth;
        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }
}
add_filter('nav_menu_css_class','add_parent_css',10,2);
function  add_parent_css($classes, $item){
     global  $dd_depth, $dd_children;
     $classes[] = 'depth'.$dd_depth;
     if($dd_children)
         $classes[] = 'parent';
    return $classes;
}

maintenant dans header.php

wp_nav_menu( array( 'container_class' => '','container' => '',  'menu' => 'header-menu', 'walker'=> new DD_Wolker_Menu ) );

header-menu remplacé par le nom de votre menu

Le code d'exemple CSS peut être le

#menu-header-menu{
    margin: 0;
    padding: 0;
}
#menu-header-menu  ul{

}

#menu-header-menu> li{
    display: inline;
    margin-left: 1.618em;
}
#menu-header-menu  li{
    list-style: none;
}
#menu-header-menu  li a{
    text-decoration: none;
    font-size:  1em;
    font-family:    'Lato',Helvetica,Arial,sans-serif ;
    letter-spacing: 1px;
}
#menu-header-menu li.parent::after{
    content:'+';
}

#menu-header-menu  .sub-menu {
   display: none;
   position: absolute;
   background-color: #fff;
}

#menu-header-menu  li:hover>.sub-menu{
    display: inline;
    width: auto;
    height: auto;
    border: solid 1px #BBBBBB;
    z-index: +1;
}

#menu-header-menu- id la liste UL principale (vous devez également la mettre à jour)


-1

Le plugin Dropdown Menus répond à la question: wp_nav_menune peut pas être utilisé pour créer un menu déroulant de sélection, tandis que le plugin fournit une dropdown_menu()fonction astucieuse qui fait admirablement le travail.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.