La suppression du conteneur de wp_nav_menu ne fonctionne pas

10

Je convertis ce menu html en wordpress:

<ul>
    <li><a href="/" class="current"><span>Home</span></a></li>
    <li><a href="/"><span>About</span></a></li>
</ul>

j'utilise:

wp_nav_menu(array(
 'menu'=>'mainmenu' ,
 'container'       => false, 
 'link_before'     => '<span>',
 'link_after'      => '</span>',
 'theme_location'  => 'primary')
 );

mais le HTML que j'obtiens est:

<div class="menu">
    <ul>
        <li class="current_page_item"><a href="http://localhost/goodsoil/" title="Home"><span>Home</span></a></li>
        <li class="page_item page-item-2"><a href="http://localhost/goodsoil/?page_id=2" title="About"><span>About</span></a></li>
    </ul>
</div>

Si j'utilise un menu personnalisé, j'obtiens:

<ul id="menu-test" class="menu">
    <li id="menu-item-6" class="menu-item menu-item-type-custom current-menu-item current_page_item menu-item-home menu-item-6"><a href="url/"><span>Home</span></a></li>
    <li id="menu-item-5" class="menu-item menu-item-type-post_type menu-item-5"><a href="url/?page_id=2"><span>About</span></a></li>
</ul>

mais si je n'utilise pas de menu personnalisé 'container' => false ne fonctionne pas Une solution?

Oterox
la source
Qu'entendez-vous par si je n'utilise pas de menu personnalisé ? Pourriez-vous décrire plus clairement dans quelles conditions vous obtenez le résultat souhaité et quand non?
Rarst
Mon thème prend en charge les menus personnalisés. Si j'utilise un menu personnalisé, le 'container' => false fonctionne très bien, mais sinon cela ne fonctionne pas. Si j'utilise 'container' => '', c'est pareil.
Oterox

Réponses:

17

[RESOLU] IL NE FONCTIONNE PAS lorsque vous faites référence à un emplacement inexistant. par exemple lorsque vous avez copié le code ailleurs ou que vous n'avez pas encore créé votre menu ou votre emplacement dans le tableau de bord.

par exemple, supprimez ", 'theme_location' => 'primary'" du code suivant:

    wp_nav_menu( array( 'container'=> false, 'menu_class'=> false, 'menu_id'=> 'ia_toplevel', 'theme_location' => 'primary' ) );

donc ça ne devrait pas ressembler

    wp_nav_menu( array( 'container'=> false, 'menu_class'=> false, 'menu_id'=> 'ia_toplevel' ) );

Cela fonctionne très bien SANS conteneur dans mon site Web SocialBlogsiteWebDesign.com

sergio
la source
Il ne semble pas fonctionner dans wordpress 3.9
tepkenvannkorn
Créez d'abord votre menu dans l'admin appearance->menupuis appelez lewp_nav_menu(array('menu'=>'<menu_name>','container'=>false))
Warface
Eh bien, c'est un comportement assez étrange: / Je pense que c'est un problème qui devrait être suivi.
enguerranws
5
Try: <?php wp_nav_menu( array( 'container' => '' ) ); ?>

http://codex.wordpress.org/Function_Reference/wp_nav_menu

Devin
la source
1
Il est vérifié que if ( $args->container )dans le code de manière falseou empty stringne fait pas de différence.
Rarst
Rarement, je viens de le tester avec un site sur lequel j'ai travaillé récemment, et la définition de 'container' => '' a effectivement fonctionné. Je pense que ce n'est pas un test de valeur, mais plus de réglage sur null et donc pas de sortie de données.
tw2113
'container' => '' ne fonctionne pas pour moi. J'utilise
WP
ne fonctionne pas pour moi aussi ... avec wp 3.2.1
papachan
5

vous faites référence à la fonction de repli des menus nav_m. Il s'agit de "wp_page_menu" et, malheureusement, cela ne produit pas le même type de balisage qu'un menu personnalisé.

Pour résoudre ce problème, créez votre propre menu de secours. J'utilise ceci:

function my_page_menu($args){
  $menu = '';
  $args['echo'] = false;
  $args['title_li'] = '';

  // If the front page is a page, add it to the exclude list
  if (get_option('show_on_front') == 'page') $args['exclude'] = get_option('page_on_front');

  $menu .= str_replace(array("\r", "\n", "\t"), '', wp_list_pages($args));

  if($menu):
    if($args['container']) $menu = '<'.$args['container'].' class="'.$args['container_class'].'">'.$menu;
    $menu .= '<ul class="'.$args['menu_class'].'">'.$menu;

    // add 'home' menu item
    $menu .= '<li class="home '.((is_front_page() && !is_paged()) ? 'current-menu-item' : null).'"><a href="'.home_url('/').'" title="'.__("Home Page").'">'.$args['link_before'].__("Home").$args['link_after'].'</a></li>';

    $menu .= '</ul>';
    if($args['container']) $menu .= '</'.$args['container'].'>\n"';
    $menu = apply_filters('wp_page_menu', $menu, $args);
  endif;

  echo $menu;
}

Vous devrez peut-être changer cela car mon thème gère les menus à sa manière, mais je pense que vous avez l'idée de base.

Et quand tu appelles wp_nav_menufais commewp_nav_menu(array('fallback_cb' => 'my_page_menu'));

Vous pouvez également faire correspondre les classes à celles d'un menu personnalisé en utilisant ceci:

add_filter('page_css_class', 'atom_page_css_classes', 420, 2);
function atom_page_css_classes($classes, $page){
  // overwrite and use page (safe) name instead of ID; nobody styles IDs...
  $new_classes = array('page-'.$page->post_name);

  // adjust active menu classes to match the ones added by wp_nav_menu()
  foreach($classes as $class)
    if($class == 'current_page_item') $new_classes[] = 'current-menu-item';
    elseif($class == 'current_page_parent') $new_classes[] = 'current-menu-parent';
    elseif($class == 'current_page_ancestor') $new_classes[] = 'current-menu-ancestor';

  return $new_classes;
}

De cette façon, vous supprimez quelques règles CSS ...

onetrickpony
la source
1

J'ai développé une solution simple et efficace en utilisant str_replace, qui peut être appliquée séparément pour une utilisation dans les tableaux de menus plutôt que ul li:

$menu = wp_nav_menu( array( 
    'theme_location' => 'main-menu', 
    'container_id' => 'mainMenu', 
    'container_class' => 'ddsmoothmenu',
    'echo' => FALSE
));

$menu = str_replace(
    array('ul id="main-menu" class="menu">','/ul>','li','/li>'), 
    array('table id="main-menu" class="menu">tr>','/tr>/table>','td','/td>'), 
    $menu
);

echo $menu;
Eduardo Carrega
la source
0

J'ai trouvé la solution.

Utilisez simplement "ul" pour 'container'

wp_nav_menu(array(
 'menu'=>'mainmenu' ,
 'container' => 'ul',
 'menu_class'=> '',
 'link_before'     => '<span>',
 'link_after'      => '</span>',
 'theme_location'  => 'primary')
 );
user2190488
la source
-1

Essaye ça

<?php wp_nav_menu( array( 'menu' => 'Menu','link_before' => '<span>', 'link_after' => '</span>' ) ); ?>
Pomme
la source