Rimozione del container da wp_nav_menu non funziona
Sto convertendo questo menu HTML in WordPress:
<ul>
<li><a href="/" class="current"><span>Home</span></a></li>
<li><a href="/"><span>About</span></a></li>
</ul>
Utilizzo:
wp_nav_menu(array(
'menu'=>'mainmenu' ,
'container' => false,
'link_before' => '<span>',
'link_after' => '</span>',
'theme_location' => 'primary')
);
ma l'HTML che ottengo è:
<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>
Se uso un menu personalizzato ottengo:
<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>
ma se non uso un menu personalizzato 'container'=>false non funziona. Qualche soluzione?

[RISOLTO] NON FUNZIONA quando si fa riferimento a una posizione inesistente. Ad esempio, quando hai copiato il codice da un'altra parte o non hai ancora creato il tuo menu o la posizione nel pannello di controllo.
Ad esempio, rimuovi ", 'theme_location' => 'primary'" dal seguente codice:
wp_nav_menu( array( 'container'=> false, 'menu_class'=> false, 'menu_id'=> 'ia_toplevel', 'theme_location' => 'primary' ) );
quindi dovrebbe apparire così
wp_nav_menu( array( 'container'=> false, 'menu_class'=> false, 'menu_id'=> 'ia_toplevel' ) );
Funziona bene SENZA container nel mio sito SocialBlogsiteWebDesign.com

Prima crea il tuo menu nell'area di amministrazione in appearance->menu
e poi chiama wp_nav_menu(array('menu'=>'<menu_name>','container'=>false))

Beh, questo è un comportamento piuttosto strano :/ Penso che sia un problema che dovrebbe essere tracciato.

Penso che sia esattamente quello che sto cercando anche io, come rimuovere il div non necessario dal mio menu di navigazione!

In qualche modo questa risposta funziona ma non con una stringa vuota o false
. Grazie.

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

Viene verificato come if ( $args->container )
nel codice, quindi false
o stringa vuota
non fanno differenza.

Rarst, l'ho appena testato su un sito a cui stavo lavorando ultimamente, e impostare 'container' => '' ha effettivamente funzionato. Penso che non stia testando il valore, ma piuttosto impostandolo a null e quindi non producendo l'output dei dati.

Ti riferisci alla funzione di fallback dei nav_menus. Questa è "wp_page_menu" e purtroppo non produce lo stesso tipo di markup che un menu personalizzato fa.
Per risolvere questo problema, crea il tuo menu di fallback personalizzato. Io uso questo:
function my_page_menu($args){
$menu = '';
$args['echo'] = false;
$args['title_li'] = '';
// Se la pagina iniziale è una pagina, aggiungila alla lista di esclusione
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;
// aggiungi la voce del menu 'home'
$menu .= '<li class="home '.((is_front_page() && !is_paged()) ? 'current-menu-item' : null).'"><a href="'.home_url('/').'" title="'.__("Pagina Home").'">'.$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;
}
Potresti dover modificarlo poiché il mio tema gestisce i menu a modo suo, ma penso che tu abbia capito l'idea di base.
E quando chiami wp_nav_menu
fallo così: wp_nav_menu(array('fallback_cb' => 'my_page_menu'));
Puoi anche far corrispondere le classi a quelle di un menu personalizzato usando questo:
add_filter('page_css_class', 'atom_page_css_classes', 420, 2);
function atom_page_css_classes($classes, $page){
// sovrascrivi e usa il nome (sicuro) della pagina invece dell'ID; nessuno stila gli ID...
$new_classes = array('page-'.$page->post_name);
// modifica le classi del menu attivo per farle corrispondere a quelle aggiunte da 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;
}
In questo modo riduci alcune regole CSS...

Ho sviluppato una soluzione semplice ed efficiente utilizzando str_replace
, che può essere applicata separatamente per l'utilizzo in tabelle di menu anziché 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;

TL;DR - usa
<?php
wp_nav_menu(
array(
// qui va il tuo ID del menu ecc.
'items_wrap' => '%3$s', // rimuove il <ul> predefinito
'container' => '', // rimuove il <div> esterno
)
);
La struttura predefinita per wp_nav_menu
con il minor numero di argomenti possibile sarà
<div class="menu-blahblah-container">
<ul id="blahblah">
<li class="menu-item">
<li class="menu-item">
<!-- ecc. -->
Il parametro items_wrap
di default è <ul id="%1$s" class="%2$s">%3$s</ul>
- quindi ci sono alcuni modi divertenti e semplici per manipolare le cose al di là di quanto richiesto qui. Ma se vuoi semplicemente rimuovere completamente quel ul
cambialo in %3$s
che fondamentalmente significa "tutto il contenuto dentro l'ul; nessun ul".
Quindi ora abbiamo:
<div class="menu-blahblah-container">
<li class="menu-item">
<li class="menu-item">
<!-- ecc. -->
Ti ritrovi con un mucchio di li
che è fantastico! Ma sono intrappolati dentro un div
, il che non è fantastico se vuoi usarli insieme ad altri li
personalizzati nel tuo bel ul
fatto in casa.
Quindi ora aggiungi il bit 'container' => ''
che altri hanno suggerito e sei a posto: solo la parte degli elementi della lista del menu senza elementi contenitore!
<li class="menu-item">
<li class="menu-item">
<!-- ecc. -->
