Das Entfernen des Containers aus dem wp_nav_menu funktioniert nicht


10

Ich konvertiere dieses HTML-Menü in WordPress:

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

ich benutze:

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

aber das HTML, das ich bekomme, ist:

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

Wenn ich ein benutzerdefiniertes Menü verwende, erhalte ich:

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

aber wenn ich kein benutzerdefiniertes Menü benutze 'container' => false funktioniert nicht Jede Lösung?


Was meinst du damit, wenn ich kein benutzerdefiniertes Menü verwende ? Könnten Sie bitte klarer beschreiben, unter welchen Bedingungen Sie das gewünschte Ergebnis erzielen und wann nicht?
Erster

Mein Thema unterstützt benutzerdefinierte Menüs. Wenn ich ein benutzerdefiniertes Menü verwende, funktioniert der 'Container' => false einwandfrei, aber wenn nicht, funktioniert es nicht. Wenn ich 'container' => '' benutze, passiert dasselbe.
Oterox

Antworten:


17

[Gelöst] Es funktioniert nicht, wenn Sie sich auf einen nicht vorhandenen Ort beziehen. Beispiel: Wenn Sie den Code von einem anderen Ort kopiert haben oder Ihr Menü oder Ihren Speicherort noch nicht im Dasboard erstellt haben.

Entfernen Sie beispielsweise ", 'theme_location' => 'primary'" aus dem folgenden Code:

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

so sollte es aussehen

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

Es funktioniert gut OHNE Container auf meiner Website SocialBlogsiteWebDesign.com


Es scheint nicht zu funktionieren in WordPress 3.9
Tepkenvannkorn

Erstellen Sie Ihr Menü im Admin in appearance->menuzuerst und rufen Sie dann daswp_nav_menu(array('menu'=>'<menu_name>','container'=>false))
Warface

5
Try: <?php wp_nav_menu( array( 'container' => '' ) ); ?>

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


1
Es wird wie if ( $args->container )im Code überprüft falseoder empty stringmacht keinen Unterschied.
Erster

Zunächst habe ich es gerade mit einer Site getestet, an der ich in letzter Zeit gearbeitet habe, und das Setzen von 'container' => '' hat tatsächlich funktioniert. Ich denke, es wird nicht auf Wert getestet, sondern mehr auf Null gesetzt und somit keine Daten ausgegeben.
Tw2113

'container' => '' funktioniert bei mir nicht. Ich benutze wp 3.0.1
Oterox

funktioniert auch nicht für mich ... mit wp 3.2.1
papachan

5

Sie beziehen sich auf die Fallback-Funktion der nav_menus. Dies ist "wp_page_menu" und leider erzeugt es nicht die gleiche Art von Markup wie ein benutzerdefiniertes Menü.

Um dies zu beheben, erstellen Sie Ihr eigenes Fallback-Menü. Ich benutze dies:

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;
}

Möglicherweise müssen Sie dies ändern, da mein Thema Menüs auf seine eigene Weise behandelt, aber ich denke, Sie haben die Grundidee.

Und wenn Sie anrufen, wp_nav_menumachen Sie es wiewp_nav_menu(array('fallback_cb' => 'my_page_menu'));

Sie können die Klassen auch mit denen eines benutzerdefinierten Menüs abgleichen, indem Sie Folgendes verwenden:

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;
}

Auf diese Weise reduzieren Sie einige CSS-Regeln ...


1

Ich habe eine einfache und effiziente Lösung entwickelt str_replace, die separat angewendet werden kann, um sie in Menütabellen zu verwenden, anstatt 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

Die Lösung gefunden.

Verwenden Sie einfach "ul" für "Container"

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

-1

Versuche dies

<?php wp_nav_menu( array( 'menu' => 'Menu','link_before' => '<span>', 'link_after' => '</span>' ) ); ?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.