Как удалить UL в wp_nav_menu?

28 янв. 2011 г., 10:32:27
Просмотры: 54.1K
Голосов: 23

Я искал на этом сайте и нашел много ответов на этот вопрос. Большинство из них не работает в моей теме.

Вот одно решение, которое я нашел, и оно работает в соответствии с моими потребностями.

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>
2
Комментарии

Зачем удалять UL, если вы все равно его добавляете снова? Вы можете использовать параметры menu_class и menu_id, чтобы задать класс и/или id атрибут для UL.

User User
28 янв. 2011 г. 15:52:37

Я хочу использовать superfish. menu_class и menu_id будут работать только если меню активировано. Если меню не существует, menu_class и menu_id применяются не к <ul>, а к <div>. Вот почему так много вопросов о wp_nav_menu(), можете проверить :)

haha haha
28 янв. 2011 г. 16:10:20
Все ответы на вопрос 7
7
80

На самом деле, WordPress поддерживает это по умолчанию:

wp_nav_menu(array(
    'items_wrap' => '%3$s'
));

Значение по умолчанию для items_wrap<ul id=\"%1$s\" class=\"%2$s\">%3$s</ul>.

7 дек. 2011 г. 17:37:47
Комментарии

Это правильный ответ. Другие варианты, предлагающие программно найти и заменить для удаления <ul> после того, как он уже был добавлен, просто нелогичны

mikemike mikemike
20 мар. 2015 г. 12:51:34

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

George Dimitriadis George Dimitriadis
10 авг. 2017 г. 13:11:13

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

Abdalla Arbab Abdalla Arbab
2 апр. 2018 г. 14:44:36

лучший ответ, не нужен хак

Eman Eman
2 февр. 2019 г. 04:58:03

у меня не работает в wp 5.2

rafaelphp rafaelphp
30 июн. 2019 г. 19:48:34

я выбираю этот ответ как лучший. (WP 5.7)

iamdual iamdual
18 мар. 2021 г. 13:37:05

Обратите внимание, что элементы всё равно будут выводиться обёрнутыми в <li>

kontur kontur
21 дек. 2024 г. 16:43:16
Показать остальные 2 комментариев
6
11

Функция 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.

Надеюсь, это поможет.

28 янв. 2011 г. 11:07:37
Комментарии

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

haha haha
28 янв. 2011 г. 13:49:46

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

haha haha
28 янв. 2011 г. 14:08:00

LOL, рад, что разобрался.

Bainternet Bainternet
28 янв. 2011 г. 14:17:27

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

t31os t31os
28 янв. 2011 г. 17:55:33

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

Bainternet Bainternet
28 янв. 2011 г. 18:17:17

Пожалуйста, ознакомьтесь с другим ответом от Martti по этому поводу. Вместо того, чтобы добавлять <ul> и затем выполнять поиск и замену, чтобы удалить его снова, вам следует просто не добавлять его изначально. Это можно сделать с помощью опции items_wrap

mikemike mikemike
20 мар. 2015 г. 12:52:33
Показать остальные 1 комментариев
0

Приведенный ниже код должен справиться с этой задачей.

<?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

14 мая 2014 г. 11:06:37
1

Если вам нужно вывести только теги <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>' );
17 нояб. 2015 г. 09:02:21
Комментарии

это отлично работает для меня, установка только 'items_wrap' => '%3$s' не имеет эффекта в wp 5.2

rafaelphp rafaelphp
30 июн. 2019 г. 19:50:39
0

У меня сработал следующий вариант:

<?php wp_nav_menu( array(
       'container' => '',
       'items_wrap' => '%3$s' 
) ); ?>

Надеюсь, это поможет.

5 апр. 2014 г. 23:58:36
0

Я знаю, что этот ответ не совсем соответствует вопросу, но многие люди хотят узнать, как удалить теги 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>
28 дек. 2019 г. 22:41:42
0
<?php
$params = array(
    'theme_location' => 'menu_location', // Расположение меню в теме
    'container' => false, // Не оборачивать в контейнер
    'echo' => false, // Не выводить сразу, а вернуть результат
    'items_wrap' => '%3$s', // Шаблон обертки пунктов меню
);

echo strip_tags(wp_nav_menu($params), '<a>'); // Вывод меню, оставляя только теги <a>
?>
13 июл. 2024 г. 16:45:50