Как мне удалить UL на wp_nav_menu?


18

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

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

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>

Но проблема возникает снова, когда я не добавляю и не активирую никакое меню через admin. 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, когда добавляете его снова? Вы можете использовать menu_classи menu_idпараметры , чтобы установить класс и / или идентификатор атрибута на UL.

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

Ответы:


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

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


@ בניית אתרים - Спасибо за ваше объяснение. Но я тут размываюсь. Согласно примечанию о том, nav-menu-template.php fallback_cb - If the menu doesn't exists, a callback function will fire. Defaults to 'wp_page_menu'. Set to false for no fallbackчто я должен заменить, чтобы заставить wp_nav_menu_no_ul()работать, если я установил false для fallback_cb? Потому что сейчас вернется пустым.
хаха

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

LOL, рад, что вы идете.
Bainternet

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

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

57

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

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

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


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

'container' => falseесли вы хотите избавиться от упаковки, <div>а также.
Георгий Димитриадис

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

Лучший ответ, нет необходимости для взлома
Эман

это не работает для меня в wp 5.2
rafaelphp


4

Если вы хотите печатать только <a>теги, вы можете пойти по этому пути:

$primaryMenu = array(
    'theme_location'  => 'primary',
    'menu'            => '',
    'container'       => '',
    'container_class' => false,
    'container_id'    => '',
    'menu_class'      => 'menu',
    'menu_id'         => 'primary-menu',
    'echo'            => false,
    'fallback_cb'     => 'wp_page_menu',
    'before'          => '',
    'after'           => '',
    'link_before'     => '',
    'link_after'      => '',
    'depth'           => 0,
    'walker'          => ''
);
echo strip_tags( wp_nav_menu( $primaryMenu ), '<a>' );

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


0

Я знаю, что этот ответ не полностью на этот вопрос, но есть очень много людей, которые узнают, как удалить теги ul и li в WordPress и добавить еще один тег в WordPress.

Как и до применения моего кода WordPress выдает эти типы вывода в меню

<ul class="*****"><li>abc</li></ul>

Но кто-то хочет преобразовать ul в div и li в тег, тогда вы должны использовать приведенный ниже код

            <?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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.