3

I have the following function in my project:

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

The function is used in my theme like this:

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

This currently returns all navigation items present in my menu - parent/top-level and sub navigation. I am wondering how to alter this to exclude all sub navigation items. I only want to display the parent/top-level items.

1
  • i don't believe the selected answer adequately answers the OP's question as worded... "Return only top-level navigation items" seems very clear to me to indicate nav menu items with no menu_item_parent... the selected answer does provide a solution IF the question was "Return only top-level pages as navigation items"... @Aness answered below and seems to provide the solution best fitting the OP's question (even if it is disappointing to have to post-filter the menu items). MY QUESTION : can/should we reword the OP's question to better match the answer? Commented Mar 17, 2023 at 19:37

2 Answers 2

3

Let's take a look at wp_get_nav_menu_items code reference.

It takes two parameters:

  • $menu - (int|string|WP_Term) (Required) Menu ID, slug, name, or object,
  • $args - (array) (Optional) Arguments to pass to get_posts().

So we can use get_posts args in here... And if we want to get only top-level posts, then post_parent arg comes useful...

So something like this should do the trick:

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)); } 
2
  • Thanks for post_parent, it looks like some undocumented secret feature… in the referencet docs link it's not a single word about it. Commented Mar 7, 2021 at 11:15
  • @ilic post_parent works because all the arguments from get_posts() are available -- which is thoroughly documented. Commented Mar 18, 2023 at 17:50
1

This worked for me :

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 is a string variable representing the menu name like 'navigation_menu' or 'primary' depending on how you registered your menu in functions.php , The function is used in my theme like this:

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.