Как удалить UL в wp_nav_menu?
Я искал на этом сайте и нашел много ответов на этот вопрос. Большинство из них не работает в моей теме.
Вот одно решение, которое я нашел, и оно работает в соответствии с моими потребностями.
function wp_nav_menu_no_ul()
{
$options = array(
'echo' => false,
'container' => false,
'theme_location' => 'primary'
);
$menu = wp_nav_menu($options);
echo preg_replace(array(
'#^<ul[^>]*>#',
'#</ul>$#'
), '', $menu);
}
Этот код удалит ul
в начале и в конце wp_nav_menu()
. Так что в моей теме я просто пишу
<ul class="primary-nav">
<?php wp_nav_menu_no_ul(); ?>
</ul>
Но проблема возникает снова, когда я не добавляю или не активирую меню через админ-панель. http://domain.com/wp-admin/nav-menus.php
Вопрос:
Как мне удалить <div><ul>**</ul></div>
независимо от того, активно меню или нет. Подскажите
Наконец я нашел рабочее решение :) functions.php
function wp_nav_menu_no_ul()
{
$options = array(
'echo' => false,
'container' => false,
'theme_location' => 'primary',
'fallback_cb'=> 'default_page_menu'
);
$menu = wp_nav_menu($options);
echo preg_replace(array(
'#^<ul[^>]*>#',
'#</ul>$#'
), '', $menu);
}
function default_page_menu() {
wp_list_pages('title_li=');
}
header.php
<ul class="primary-nav">
<?php wp_nav_menu_no_ul(); ?>
</ul>
Это правильный ответ. Другие варианты, предлагающие программно найти и заменить для удаления <ul>
после того, как он уже был добавлен, просто нелогичны

'container' => false
если вы хотите также избавиться от оборачивающего <div>
.

Это действительно настраивается в WordPress по умолчанию. Спасибо!

Функция wp_nav_menu принимает аргумент fallback_cb, который указывает имя функции, выполняемой если меню не существует. Измените ваш код следующим образом:
function wp_nav_menu_no_ul()
{
$options = array(
'echo' => false,
'container' => false,
'theme_location' => 'primary',
'fallback_cb'=> 'fall_back_menu'
);
$menu = wp_nav_menu($options);
echo preg_replace(array(
'#^<ul[^>]*>#',
'#</ul>$#'
), '', $menu);
}
function fall_back_menu(){
return;
}
Вы также можете полностью убрать контейнер меню и выполнить другие действия с помощью дополнительных аргументов, передаваемых в функцию wp_nav_menu.
Надеюсь, это поможет.

@בניית אתרים - Спасибо за объяснение. Но я немного запутался. Согласно примечанию в nav-menu-template.php
: fallback_cb - Если меню не существует, будет вызвана callback-функция. По умолчанию 'wp_page_menu'. Установите false, чтобы отключить fallback
. Что мне нужно заменить, чтобы wp_nav_menu_no_ul()
работала, если я установил false для fallback_cb
? Потому что сейчас она возвращает пустоту.

Теперь понял :) Большое спасибо, בניית אתרים. Кстати, как произносится твой ник? Мой - ха ха

Я тоже задавался этим вопросом, предполагаю, что это иврит, было бы интересно узнать точный перевод, просто из любопытства.. :)

:) Да, это иврит, и это ник, который я выбрал давным-давно, и если перевести его правильно, то это означает что-то вроде "веб-дизайн".

Приведенный ниже код должен справиться с этой задачей.
<?php
$my_menu = array(
'menu' => 'main-menu',
'container' => '',
'items_wrap' => '%3$s'
);
wp_nav_menu( $my_menu );
?>
Ссылка на документацию функции wp_nav_menu: http://codex.wordpress.org/Function_Reference/wp_nav_menu

Если вам нужно вывести только теги <a>
, можно сделать так:
$primaryMenu = array(
'theme_location' => 'primary', // Расположение меню в теме
'menu' => '', // Название меню
'container' => '', // Контейнер меню (отключен)
'container_class' => false, // Класс контейнера (отключен)
'container_id' => '', // ID контейнера
'menu_class' => 'menu', // Класс меню
'menu_id' => 'primary-menu', // ID меню
'echo' => false, // Не выводить сразу, а вернуть HTML
'fallback_cb' => 'wp_page_menu', // Функция для резервного меню
'before' => '', // Текст перед ссылкой
'after' => '', // Текст после ссылки
'link_before' => '', // Текст перед текстом ссылки
'link_after' => '', // Текст после текста ссылки
'depth' => 0, // Глубина вложенности
'walker' => '' // Пользовательский Walker
);
// Выводим меню, оставляя только теги <a>
echo strip_tags( wp_nav_menu( $primaryMenu ), '<a>' );

Я знаю, что этот ответ не совсем соответствует вопросу, но многие люди хотят узнать, как удалить теги ul и li в WordPress и добавить другие теги.
Например, до применения моего кода WordPress выводит меню в таком формате:
<ul class="*****"><li>abc</li></ul>
Но если кто-то хочет заменить ul на div, а li на тег a, то следует использовать следующий код:
<?php
$menuParameters = array(
'menu' => 'primary_menu', // Основное меню
'link_before' => '<span>', // Текст перед ссылкой
'link_after' => '</span>', // Текст после ссылки
'before' => '<div class="tp-primary-header mui-top-home">', // Текст перед меню
'after' => '</div>', // Текст после меню
'container' => false, // Не использовать контейнер
'echo' => false, // Не выводить сразу
'depth' => 0, // Глубина вложенности
);
echo strip_tags(wp_nav_menu( $menuParameters ), '<a><span><div>' ); // Оставить только разрешенные теги
?>
Это даст результат в следующем формате:
<div class="tp-primary-header mui-top-home"><a href="#"><span>ABC</span></a></div>
<div class="tp-primary-header mui-top-home"><a href="#"><span>def</span></a></div>
<div class="tp-primary-header mui-top-home"><a href="#"><span>XYZ</span></a></div>

<?php
$params = array(
'theme_location' => 'menu_location', // Расположение меню в теме
'container' => false, // Не оборачивать в контейнер
'echo' => false, // Не выводить сразу, а вернуть результат
'items_wrap' => '%3$s', // Шаблон обертки пунктов меню
);
echo strip_tags(wp_nav_menu($params), '<a>'); // Вывод меню, оставляя только теги <a>
?>
