Удаление контейнера из 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))
Warface
Что ж, это довольно странное поведение :/ Думаю, эту проблему нужно отслеживать.
enguerranws
Думаю, это именно то, что мне тоже нужно — как убрать лишний div из моего навигационного меню!
Krys
Как-то этот ответ работает, но не с пустой строкой или false. Спасибо.
Alexander Ivashchenko
Попробуйте: <?php wp_nav_menu( array( 'container' => '' ) ); ?>
В коде проверяется как if ( $args->container ), поэтому false или пустая строка не имеют различий.
Rarst
Rarst, я только что проверил это на сайте, над которым недавно работал, и установка 'container' => '' действительно сработала. Думаю, проверяется не значение, а скорее установка в null, что приводит к отсутствию вывода данных.
tw2113
Вы говорите о резервной функции для навигационных меню. Это "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">
<!-- и так далее -->