Удаление контейнера из wp_nav_menu не работает

8 нояб. 2010 г., 16:47:12
Просмотры: 46.4K
Голосов: 15

Я конвертирую это 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 не работает. Есть ли решение?

2
Комментарии

Что вы имеете в виду под если я не использую кастомное меню? Не могли бы вы подробнее описать, при каких условиях вы получаете желаемый результат, а когда нет?

Rarst Rarst
8 нояб. 2010 г. 22:33:48

Моя тема поддерживает кастомные меню. Если я использую кастомное меню, то 'container'=>false работает корректно, но если нет — то не работает. Если я использую 'container'=>'' — происходит то же самое.

Oterox Oterox
9 нояб. 2010 г. 17:29:11
Все ответы на вопрос 7
4
19

[РЕШЕНО] ЭТО НЕ РАБОТАЕТ, если вы ссылаетесь на несуществующее местоположение. Например, когда вы скопировали код из другого места или еще не создали свое меню или местоположение в панели управления.

Например, удалите ", '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

26 апр. 2011 г. 01:28:10
Комментарии

Кажется, не работает в WordPress 3.9

tepkenvannkorn tepkenvannkorn
22 апр. 2014 г. 03:42:46

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

Warface Warface
11 мая 2014 г. 03:40:44

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

enguerranws enguerranws
26 мая 2020 г. 11:12:44

... или не удаляйте его, а потратьте минуту на создание местоположения меню.

squarecandy squarecandy
14 июл. 2023 г. 06:15:56
3

Нашел решение.

Просто используйте "ul" для 'container'

wp_nav_menu(array(
 'menu'=>'mainmenu' ,
 'container' => 'ul',
 'menu_class'=> '',
 'link_before'     => '<span>',
 'link_after'      => '</span>',
 'theme_location'  => 'primary')
 );
7 янв. 2020 г. 18:20:46
Комментарии

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

Krys Krys
5 окт. 2020 г. 17:21:22

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

Alexander Ivashchenko Alexander Ivashchenko
13 мая 2021 г. 15:41:36

это спасло мне жизнь от ада, я перепробовал все туториалы, ничего не работало с последними версиями, а это сработало именно так, как я хотел

Amir Rahman Amir Rahman
12 окт. 2021 г. 06:00:59
4
Попробуйте: <?php wp_nav_menu( array( 'container' => '' ) ); ?>

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

8 нояб. 2010 г. 17:34:07
Комментарии

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

Rarst Rarst
8 нояб. 2010 г. 22:34:52

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

tw2113 tw2113
9 нояб. 2010 г. 00:21:57

'container' => '' не работает у меня. Я использую WordPress 3.0.1

Oterox Oterox
9 нояб. 2010 г. 17:25:42

у меня тоже не работает ... с wp 3.2.1

papachan papachan
1 дек. 2011 г. 14:11:43
0

Вы говорите о резервной функции для навигационных меню. Это "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 правил...

23 дек. 2010 г. 17:05:26
1

Я разработал простое и эффективное решение с использованием 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;
13 июн. 2012 г. 00:09:07
Комментарии

Это плохая идея, так как это приведёт к ошибкам, если когда-либо произойдут изменения в коде, который генерирует ядро.

squarecandy squarecandy
14 июл. 2023 г. 06:13:26
0

Кратко: используйте

<?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">
<!-- и так далее -->
14 июл. 2023 г. 06:12:13
0
-1

Попробуйте это

<?php wp_nav_menu( array( 'menu' => 'Меню','link_before' => '<span>', 'link_after' => '</span>' ) ); ?>
17 янв. 2012 г. 11:02:38