Удаление контейнера из wp_nav_menu не работает
Я конвертирую это HTML меню в WordPress:
<ul>
<li><a href="/" class="current"><span>Главная</span></a></li>
<li><a href="/"><span>О нас</span></a></li>
</ul>
Я использую:
wp_nav_menu(array(
'menu'=>'mainmenu' ,
'container' => false,
'link_before' => '<span>',
'link_after' => '</span>',
'theme_location' => 'primary')
);
но получаю такой HTML:
<div class="menu">
<ul>
<li class="current_page_item"><a href="http://localhost/goodsoil/" title="Главная"><span>Главная</span></a></li>
<li class="page_item page-item-2"><a href="http://localhost/goodsoil/?page_id=2" title="О нас"><span>О нас</span></a></li>
</ul>
</div>
Если я использую пользовательское меню, то получаю:
<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>Главная</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>О нас</span></a></li>
</ul>
но если я не использую пользовательское меню, 'container'=>false не работает. Есть ли решение?

[РЕШЕНО] ЭТО НЕ РАБОТАЕТ, если вы ссылаетесь на несуществующее местоположение. Например, когда вы скопировали код из другого места или еще не создали свое меню или местоположение в панели управления.
Например, удалите ", 'theme_location' => 'primary'" из следующего кода:
wp_nav_menu( array( 'container'=> false, 'menu_class'=> false, 'menu_id'=> 'ia_toplevel', 'theme_location' => 'primary' ) );
так должно выглядеть
wp_nav_menu( array( 'container'=> false, 'menu_class'=> false, 'menu_id'=> 'ia_toplevel' ) );
Это прекрасно работает БЕЗ container на моем сайте SocialBlogsiteWebDesign.com

Сначала создайте меню в админке в разделе Внешний вид->Меню
, затем вызовите wp_nav_menu(array('menu'=>'<имя_меню>','container'=>false))

Что ж, это довольно странное поведение :/ Думаю, эту проблему нужно отслеживать.

Думаю, это именно то, что мне тоже нужно — как убрать лишний div из моего навигационного меню!

Как-то этот ответ работает, но не с пустой строкой или false
. Спасибо.

Попробуйте: <?php wp_nav_menu( array( 'container' => '' ) ); ?>

В коде проверяется как if ( $args->container )
, поэтому false
или пустая строка
не имеют различий.

Rarst, я только что проверил это на сайте, над которым недавно работал, и установка 'container' => '' действительно сработала. Думаю, проверяется не значение, а скорее установка в null, что приводит к отсутствию вывода данных.

Вы говорите о резервной функции для навигационных меню. Это "wp_page_menu", и, к сожалению, она не генерирует такую же разметку, как пользовательское меню.
Чтобы исправить это, создайте свое собственное резервное меню. Я использую следующее:
function my_page_menu($args){
$menu = '';
$args['echo'] = false;
$args['title_li'] = '';
// Если главной страницей является страница, добавляем ее в список исключений
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;
// добавляем пункт меню 'home'
$menu .= '<li class="home '.((is_front_page() && !is_paged()) ? 'current-menu-item' : null).'"><a href="'.home_url('/').'" title="'.__("Главная страница").'">'.$args['link_before'].__("Главная").$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;
}
Возможно, вам нужно будет изменить этот код, так как моя тема обрабатывает меню по-своему, но я думаю, вы уловили основную идею.
И когда вы вызываете wp_nav_menu
, делайте это так: wp_nav_menu(array('fallback_cb' => 'my_page_menu'));
Вы также можете сопоставить классы с классами пользовательского меню, используя это:
add_filter('page_css_class', 'atom_page_css_classes', 420, 2);
function atom_page_css_classes($classes, $page){
// переопределяем и используем безопасное имя страницы вместо ID; никто не стилизует ID...
$new_classes = array('page-'.$page->post_name);
// настраиваем классы активного меню, чтобы они соответствовали тем, что добавляет 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;
}
Таким образом, вы сократите несколько CSS правил...

Я разработал простое и эффективное решение с использованием str_replace
, которое можно применить отдельно для использования таблиц в меню вместо 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;

Кратко: используйте
<?php
wp_nav_menu(
array(
// здесь указывается ID меню и т.д.
'items_wrap' => '%3$s', // удаляет стандартный <ul>
'container' => '', // удаляет внешний <div>
)
);
Стандартная структура для wp_nav_menu
с минимальным количеством параметров будет выглядеть так:
<div class="menu-blahblah-container">
<ul id="blahblah">
<li class="menu-item">
<li class="menu-item">
<!-- и так далее -->
Параметр items_wrap
по умолчанию имеет значение <ul id="%1$s" class="%2$s">%3$s</ul>
— это даёт интересные возможности для манипуляций, выходящих за рамки данного вопроса. Но если вы просто хотите полностью убрать этот ul
, измените значение на %3$s
, что означает "всё содержимое внутри ul, но без самого ul".
Теперь у нас получится:
<div class="menu-blahblah-container">
<li class="menu-item">
<li class="menu-item">
<!-- и так далее -->
Теперь у нас есть набор li
, что отлично! Но они заключены внутри div
, что не очень хорошо, если вы хотите использовать их вместе с какими-то своими собственными li
внутри своего кастомного ul
.
Добавьте параметр 'container' => ''
, как уже советовали другие, и вы получите желаемый результат: только элементы списка меню без каких-либо контейнеров!
<li class="menu-item">
<li class="menu-item">
<!-- и так далее -->
