hey all,
i’m writing an automated function that generates a menu from a function. it calls wp_nav_menu on each item from an array, because i want this to be dynamic. the problem is, no matter how i set it, if the menu doesn’t exist, wp_nav_menu is generating a menu, eg the ‘default’. here is my code (items is just a set of strings):
for($i=0;$i<count($items);$i++) {
$themenu=$items[$i];
$mymenu = wp_nav_menu(array(
'menu' => $themenu,
'menu_class' => 'mymenu',
'container' => 'false',
'fallback_cb' => 'false',
'echo' => false
)
);
echo $themenu;
}
i know its partially working, because if $themenu exists, it shows the correct one. but if it doesn’t, it’ll just show any menu! not just annoying, but also actively breaks the user experience.
wp_nav_menu()
indeed tries a lot to provide you with a menu, andfallback_cb
is only executed when nothing else works. From the code:menu
is provided and refers to an existing menu (looked up viawp_get_nav_menu_object()
, which accepts an id, slug or name), this will be the menutheme_location
is set to a registered menu location, this will be passed towp_get_nav_menu_object()
fallback_cb
is called, which by default iswp_page_menu
, which is a menu of all the pagesSo if you only want to use the
menu
argument, you should test this yourself by callingwp_get_nav_menu_object()
. Only if this returns something you should callwp_nav_menu()
.Try wrapping your echo inside of a
has_nav_menu()
conditional:(If I’m following your code correctly…)
From the Codex entry for wp_nav_menu():
So have you tried passing
'fallback_cb' => false
?EDIT:
As per the comment below,
'fallback_cb' => 'false'
is tellingwp_nav_menu()
to fallback to a function calledfalse()
, and since this function doesn’t exist, it falls back to its normal fallback,wp_page_menu()
. So, use'fallback_cb' => false
(i.e. a boolean value, rather than a string value).