web-dev-qa-db-fra.com

Renvoie uniquement les éléments de navigation de niveau supérieur d'un menu utilisant wp_get_nav_menu_items

J'ai la fonction suivante dans mon projet:

function cr_get_menu_items($menu_location)
{
    $locations = get_nav_menu_locations();
    $menu = get_term($locations[$menu_location], 'nav_menu');
    return wp_get_nav_menu_items($menu->term_id);
}

La fonction est utilisée dans mon thème comme ceci:

  <?php $nav = cr_get_menu_items('navigation_menu') ?>
  <?php foreach ($nav as $link): ?>
    <a href="<?= $link->url ?>"><?= $link->title ?></a>
  <?php endforeach; ?>

Ceci renvoie actuellement tous les éléments de navigation présents dans mon menu - navigation parent/de haut niveau et sous-navigation. Je me demande comment modifier cela en exclure tous les éléments de navigation secondaires. Je souhaite uniquement afficher les éléments parent/de niveau supérieur.

1
Liz

Regardons wp_get_nav_menu_itemsréférence du code .

Il faut deux paramètres:

  • $menu - (int | string | WP_Term) (Obligatoire) ID de menu, slug, nom ou objet,
  • $args - (array) (Facultatif) Arguments à transmettre à get_posts ().

Donc, nous pouvons utiliser get_posts args ici ... Et si nous voulons obtenir uniquement les messages de premier niveau, alors post_parent arg est utile ...

Donc, quelque chose comme ceci devrait faire l'affaire:

function cr_get_menu_items($menu_location)
{
    $locations = get_nav_menu_locations();
    $menu = get_term($locations[$menu_location], 'nav_menu');
    return wp_get_nav_menu_items($menu->term_id, array('post_parent' => 0));
}
1
Krzysiek Dróżdż

Cela a fonctionné pour moi:

function cr_get_menu_items($Your_menu_location)
{
  $menuLocations = get_nav_menu_locations();
  $YourmenuID = $menuLocations[$Your_menu_location];
  $YourNavItems = wp_get_nav_menu_items($YourmenuID);
} 

$Your_menu_location est une variable chaîne représentant le nom du menu tel que 'navigation_menu' ou 'primary', selon la façon dont vous avez enregistré votre menu dans functions.php.

<?php
  $menuitems = cr_get_menu_items('navigation_menu') ;
  foreach ( (array)$menuitems as $menuitem ) 
  {
    if (!$menuitem->menu_item_parent )
    echo '<a class="nav-link" href="'.$navItem->url.'">'.$navItem->title.' </a>';
  }
?>
0
Aness