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?


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


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


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 ...


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;

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')
 );

-1

Essaye ça

<?php wp_nav_menu( array( 'menu' => 'Menu','link_before' => '<span>', 'link_after' => '</span>' ) ); ?>
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.