Jak usunąć UL z wp_nav_menu?

19

Przeszukuję tę stronę i znalazłem wiele odpowiedzi na to pytanie. Większość z nich nie działa na mój temat.

Oto jedno rozwiązanie, które znalazłem i działa zgodnie z moimi potrzebami.

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);

}

Ten kod zostanie usunięty ulna początku i na końcu wp_nav_menu(). Więc w moim temacie po prostu piszę

<ul class="primary-nav">
<?php  wp_nav_menu_no_ul(); ?>
</ul>

Ale problem pojawia się ponownie, gdy nie dodam ani nie aktywuję żadnego menu przez administratora. http://domain.com/wp-admin/nav-menus.php

Pytanie:

Jak usunąć, <div><ul>**</ul></div>czy menu jest aktywne, czy nie. Daj mi znać


W końcu udało mi się to :) 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>
ha ha
źródło
Dlaczego mimo to chcesz usunąć UL, gdy dodajesz go ponownie? Możesz użyć parametrów menu_classi menu_id, aby ustawić atrybut klasy i / lub id na UL.
Chcę użyć superfisha. menu_classi menu_iddziała tylko wtedy, gdy menu jest aktywne. Jeśli menu nie istnieje menu_classi menu_idnie jest tak, <ul>ale jak <div>. dlatego zbyt wiele pytań na wp_nav_menu()twój temat możesz to przetestować :)
haha

Odpowiedzi:

11

Funkcja wp_nav_menu przyjmuje argument fallback_cb, który jest nazwą funkcji do uruchomienia, jeśli menu nie istnieje. więc zmień kod na coś takiego:

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;
}

możesz nawet usunąć kontener z menu i robić inne rzeczy z kilkoma argumentami wysłanymi do funkcji wp_nav_menu

Mam nadzieję że to pomoże.

Bainternet
źródło
@ בניית אתרים - Dziękujemy za wyjaśnienie. Ale tutaj się zacieram. Zgodnie z uwagą na temat 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 fallbackCo powinienem wymienić, aby wp_nav_menu_no_ul()działał, jeśli ustawiłem wartość false na fallback_cb? Ponieważ na razie zwraca puste.
haha
Teraz zrozumiane :) Wielkie dzięki בניית אתרים. BTW, jak wymówić twój pseudonim? Mójha ha
haha
LOL, cieszę się, że idziesz.
Bainternet
Zastanawiałem się nad tym samym, zakładam, że to hebrajski, co byłoby dokładnym tłumaczeniem, z ciekawości .. :)
t31os
:) tak, to hebrajski i to nicka, które wziąłem pod uwagę, że jeśli odpowiednio przetłumaczone oznacza coś w stylu „projektowanie stron internetowych”.
Bainternet
58

W rzeczywistości WordPress domyślnie obsługuje to:

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

Domyślne ustawienie items_wrapto <ul id=\"%1$s\" class=\"%2$s\">%3$s</ul>.

Martti Laine
źródło
3
To jest poprawna odpowiedź. Inne odpowiedzi na temat automatycznego wyszukiwania i zamiany w celu usunięcia <ul>po jego dodaniu są tylko wstecz
mikemike,
'container' => falsejeśli chcesz również pozbyć się opakowania <div>.
George Dimitriadis,
Domyślnie można go konfigurować w WordPress. Dzięki!
Abdalla Arbab
najlepsza odpowiedź, nie trzeba hakować
Eman
to nie działa dla mnie w
WP
4

Jeśli chcesz wydrukować tylko <a>tagi, możesz przejść w ten sposób:

$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>' );
Pavlo Zamoroka
źródło
ta praca jest idealna dla mnie, ustawienie tylko `` items_wrap '=>'% 3 $ s '' nie ma wpływu na wp 5.2
rafaelphp
2

Dla mnie zadziałało to:

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

Mam nadzieję, że to pomoże.

Piksel orbity
źródło
0

Wiem, że ta odpowiedź nie jest całkowicie na to pytanie, ale jest tak wiele osób, które wiedzą, jak usunąć tag ul i li w WordPress i dodać kolejny tag w WordPress.

Podobnie jak przed zastosowaniem mojego kodu WordPress daje tego rodzaju dane wyjściowe w menu

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

Ale ktoś chce zmienić ul na div, a li na tag, powinieneś użyć poniższego kodu

            <?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>' );
                ?>

Daje to wynik w następującym formacie

<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>
Sumit Kumar Gupta
źródło