Menu fallback “menu_class” rendering a “div” instead of a “ul”

First, I think you’re confusing the wp_nav_menu() args. The 'menu_class' parameter defines the class added to the menu element, which by default is <ul>, as per the 'items_wrap' parameter. The default 'menu_class' is 'menu', which results in <ul class="menu">.

The real issue is actually the fallback_cb – the callback used when no menu is defined – which defaults to wp_page_menu().

Now, both wp_nav_menu() and wp_page_menu() output an unordered list (<ul>) wrapped by a container (<div>) by default. In your call to wp_nav_menu(), you have: 'container' => false, which overrides the menu list being wrapped by a container <div>. But that parameter does not get passed to the default wp_page_menu() callback output.

The easiest solution would be to define your own callback:

wp_nav_menu( array(
    // Add your normal args here
    'fallback_cb' => 'wpse116656_nav_menu_cb'
) );

Then declare your callback function:

function wpse116656_nav_menu_cb() {
    wp_page_menu( array(
        // Args here
    ) );
}

Now, here’s the caveat:

  • wp_nav_menu() applies the 'menu_class' parameter to the unordered list

    (<div><ul class="$menu_class"></ul></div>)

  • wp_page_menu() applies the 'menu_class' parameter to the wrapper container outside the menu list

    (<div class="$menu_class"><ul></ul></div>)

So, you’ll need to account for that with your CSS.