Comment supprimer UL sur wp_nav_menu?

18

J'ai recherché sur ce site et trouvé de nombreuses réponses à cette question. La plupart d'entre eux ne travaillent pas sur mon thème.

Voici une solution unique que j'ai trouvée et qui fonctionne selon mes besoins.

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

}

Ce code sera supprimé ulau début et à la fin de wp_nav_menu(). Donc dans mon thème j'écris juste

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

Mais le problème revient quand je n'ajoute ni n'active aucun menu via admin. http://domain.com/wp-admin/nav-menus.php

Question:

Comment supprimer le <div><ul>**</ul></div>si le menu est actif ou non. Faites le moi savoir


Enfin je l'ai fait fonctionner :) 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>
haha
la source
Pourquoi voulez-vous supprimer l'UL quand vous l'ajoutez quand même? Vous pouvez utiliser les paramètres menu_classet menu_idpour définir un attribut de classe et / ou id sur l'UL.
Je veux utiliser superfish. menu_classet menu_idne fonctionnera que si le menu est activé. Si le menu n'existe pas menu_classet menu_idn'est pas aussi <ul>mais que <div>. c'est pourquoi trop de questions sur wp_nav_menu()vous peuvent le tester :)
haha

Réponses:

11

La fonction wp_nav_menu prend un argument de fallback_cb qui est le nom de la fonction à exécuter si le menu n'existe pas. alors changez votre code en quelque chose comme ceci:

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

vous pouvez même supprimer le conteneur du menu et faire d'autres choses avec des arguments supplémentaires envoyés à la fonction wp_nav_menu

J'espère que cela t'aides.

Bainternet
la source
@ בניית אתרים - Merci pour votre explication. Mais je deviens flou ici. Selon la note sur 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 fallbackce que dois-je remplacer pour faire wp_nav_menu_no_ul()fonctionner si je mets false sur le fallback_cb? Parce qu'il revient vide pour l'instant.
haha
Maintenant compris :) Merci beaucoup בניית אתרים. BTW, comment prononcer ton pseudo? Mineha ha
haha
LOL, content de l'avoir fait.
Bainternet
Je me suis demandé la même chose, c'est l'hébreu je suppose, quelle serait une traduction exacte, par curiosité .. :)
t31os
:) oui il est hébreu et c'est un pseudo que j'ai ramassé un certain temps qui, s'il est correctement traduit, signifie quelque chose comme "web design".
Bainternet
57

En fait, WordPress prend en charge cela par défaut:

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

La valeur par défaut items_wrapest <ul id=\"%1$s\" class=\"%2$s\">%3$s</ul>.

Martti Laine
la source
3
Ceci est la bonne réponse. Les autres réponses de faire une recherche et un remplacement programmatique pour supprimer une <ul>fois qu'il a déjà été ajouté sont juste à l'envers
mikemike
'container' => falsesi vous voulez aussi vous débarrasser de l'emballage <div>.
George Dimitriadis
Il est vrai configurable dans WordPress par défaut. Merci!
Abdalla Arbab
meilleure réponse, pas besoin de hack
Eman
cela ne fonctionne pas pour moi dans wp 5.2
rafaelphp
4

Si vous souhaitez imprimer uniquement des <a>balises, vous pouvez procéder comme suit:

$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
la source
ce travail est parfait pour moi, définir uniquement `` items_wrap '=>'% 3 $ s '' n'a pas d'effet dans wp 5.2
rafaelphp
2

Pour moi, ce qui a fonctionné était le suivant:

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

J'espère que cela aide.

Pixel orbital
la source
0

Je sais que cette réponse n'est pas complètement pour cette question, mais il y a tellement de gens qui savent comment supprimer les balises ul et li dans WordPress et ajouter une autre balise dans WordPress.

Comme avant d'appliquer mon code, WordPress donne ces types de sortie dans le menu

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

Mais quelqu'un veut changer ul en div et li en une balise alors vous devez utiliser le code ci-dessous

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

Cela donne une sortie dans le format suivant

<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
la source