web-dev-qa-db-fra.com

Supprimer l'élément conteneur de wp_nav_menu () Markup

J'ai essayé plusieurs options comme configurer 'container' => false et enregistrer le theme_location et effectuer une recherche sur les forums, mais je ne parviens pas à supprimer le "div" qui apparaît avec le wp_nav_menu dans ma page:

<?php get_nav_menu();?>

function get_nav_menu() {
    $navMenuDefaults = array(
    'theme_location'  => 'header-nav',
    'menu'            => '',
    'container'       => false,
    'container_class' => '',
    'container_id'    => '',
    'menu_class'      => '',
    'menu_id'         => '',
    'echo'            => true,
    'fallback_cb'     => 'wp_page_menu',
    'before'          => '',
    'after'           => '',
    'link_before'     => '',
    'link_after'      => '',
    'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',
    'depth'           => 0,
    'walker'          => ''
);
    return wp_nav_menu($navMenuDefaults);
}

et dans functions.php:

function register_top_nav() {
  register_nav_menu('header-nav',__( 'Header Nav' ));
}
add_action( 'init', 'register_top_nav' );

Je ne sais pas pourquoi j'obtiens la sortie suivante:

<div class="">
    <ul>
        <li class="page_item page-item-2">
            <a href="url">Sample Page</a>
        </li>
    </ul>
</div>

Comment puis-je obtenir quelque chose comme suit:

<ul class="abc">
    <li>
        <a href="#">dfdf</a>
    </li>
</ul>

merci.

4
me_digvijay

FYI: container => '' est une opération sur une chaîne. Elle est définie par défaut par div. Vous ne pouvez pas utiliser true or false like bool expression.

Il suffit de changer le container => 'ul' et j'espère que vous obtiendrez ce que vous voulez voir. pour plus de détails, veuillez lire ceci: https://developer.wordpress.org/reference/functions/wp_nav_menu/

Merci Musa

3
MD MUSA

Problème

Vous n'avez pas créé un menu sur le panneau Appearance > Menus dans le tableau de bord d'administrateur WordPress .

Mon raisonnement est basé sur un bogue qui survient dans les conditions suivantes:

  • Aucun menu de navigation n'a été créé
  • wp_nav_menu() a été appelé avec l'argument par défaut 'fallback_cb''wp_page_menu'
  • wp_nav_menu() a été appelé avec un argument 'container' destiné à éliminer le conteneur (tout ce qui la fonction empty() retourne true pour)

Solutions

L’un des éléments suivants doit supprimer le conteneur <div>.

  • Créez un menu dans le panneau Appearance > Menus. Le <div> superflu devrait disparaître même si vous n'associez pas le nouveau menu à l'emplacement de votre thème enregistré 'header-nav'.
  • Remplacez l’argument 'fallback_cb' par une fonction personnalisée qui renvoie une balise par défaut, voire une chaîne vide, c.-à-d.

    'fallback_cb' => function() { return ''; },
    

Explication

Si la fonction wp_nav_menu() ne parvient pas à localiser le menu indiqué, elle tente ensuite deux opérations supplémentaires pour générer un balisage de menu:

  1. Affiche le premier menu trouvé trouvé.
  2. Affiche le balisage du menu généré par la fonction indiquée par l'argument 'fallback_cb' (par défaut, wp_page_menu() ).

Votre commentaire posté correspond à un post-type page avec un ID post de 2 et le titre "Exemple de page", indiquant éventuellement une nouvelle installation WordPress, pour laquelle il serait raisonnable de supposer qu'aucun menu n'a été créé. Cela indique que votre appel wp_nav_menu() est susceptible de retomber sur wp_page_menu(), car la fonction de secours créera un menu impromptu à partir d’un nombre quelconque de pages de votre installation.

Lorsque la fonction 'fallback_cb' est appelée, elle reçoit les mêmes arguments que ceux donnés à wp_nav_menu() (fusionnés avec les arguments par défaut). Ici, la documentation du Codex sur la fonction wp_page_menu() est un peu dépassée, car depuis WordPress 4.4.0, la fonction accepte et gère un argument 'container'. Donc, wp_page_menu() est appelé avec le même argument 'container' que vous avez transmis à wp_nav_menu(), à savoir '' (chaîne littérale vide) ou false.

La substance du problème est un comportement contradictoire qui découle de ces lignes in wp_page_menu():

// Fallback in case `wp_nav_menu()` was called without a container.
if ( empty( $container ) ) {
    $container = 'div';
}

Donc, puisque empty() évalue les false booléens ainsi que '' en true, ce petit système à sécurité intrinsèque pense que vous êtes fou de ne pas vouloir de conteneur et vous en rajoute un pour vous.

1
bosco

Vous pouvez essayer avec ce scénario.

Étape 1:

Placez ce code dans le fichier functions.php de votre thème:

add_action( 'after_setup_theme', 'theme_nav_setup' );

if ( ! function_exists( 'theme_nav_setup' ) ){
  function theme_nav_setup() {  
    register_nav_menu( 'header-nav_new', __( 'Main Menu', 'text-domain' ) );
  }
}

Étape 2:

Appelez ensuite ceci où vous pouvez voir la sortie de ce menu:

wp_nav_menu( array(
  'menu' => 'header-nav_new',
  'theme_location'    => 'header-nav_new',
  'depth'             => 6,
  'container'         => 'ul',
  'fallback_cb'       => 'wp_page_menu',
  'menu_class'        => 'abc'
 )
);
0
MD MUSA

D'après ma propre expérience, si vous n'avez pas encore affecté de menu à l'emplacement de menu enregistré, tous les paramètres d'argument précédés de container ne fonctionneront pas. vous devez affecter votre menu créé à l'emplacement de menu enregistré avant de voir le changement.

0
Pakpoom Tiwakornkit

Oui, vous pouvez utiliser ce code

$nav_menu = array(
       'title_li'        => '', 
       'container'       => '',
       'theme_location'  => 'header-nav',   
        'menu_class'     => '',
        'menu_id'        => '',
);                    

wp_nav_menu( $nav_menu );

Le code ci-dessus affichera le menu au format ul et li sans avoir aucune classe ni id pour les balises ul et li

0
Aftab

Lorsque vous définissez "conteneur" sur false, cela devrait fonctionner sauf s'il y a un bogue quelconque dans l'environnement ou un conflit avec autre chose.

En fait, j'ai testé cela dans Twenty Fifteen et l'un de Mes thèmes Themeforest.

Pouvez-vous vérifier si vous avez un cache interne qui ne reflète pas vos modifications immédiatement?

Merci

0