How do I create predefined menus for my theme?

This is my code thus far:

function register_my_menus() {
    register_nav_menus(
        array(
             'header-menu' => __( 'Header Menu' ),
             'extra-menu' => __( 'Extra Menu' )
        )
    );
}
add_action( 'init', 'register_my_menus' );

But this seems to only register ‘locations’ in which to place custom menus.
What I want is for all the custom menus (and menu items) to be fully setup on after_theme_setup or init.

Read More

Thanks

Related posts

Leave a Reply

2 comments

  1. Example code taken from new2wp.com located HERE

       // Function for registering wp_nav_menu() in 3 locations
        add_action( 'init', 'register_navmenus' );
        function register_navmenus() {
            register_nav_menus( array(
                'Top'       => __( 'Top Navigation' ),
                'Header'    => __( 'Header Navigation' ),
                'Footer'    => __( 'Footer Navigation' ),
                )
            );
    
            // Check if Top menu exists and make it if not
            if ( !is_nav_menu( 'Top' )) {
                $menu_id = wp_create_nav_menu( 'Top' );
                $menu = array( 'menu-item-type' => 'custom', 'menu-item-url' => get_home_url('/'),'menu-item-title' => 'Home' );
                wp_update_nav_menu_item( $menu_id, 0, $menu );
            }
            // Check if Header menu exists and make it if not
            if ( !is_nav_menu( 'Header' )) {
                $menu_id = wp_create_nav_menu( 'Header' );
                $menu = array( 'menu-item-type' => 'custom', 'menu-item-url' => get_home_url('/'), 'menu-item-title' => 'Home' );
                wp_update_nav_menu_item( $menu_id, 0, $menu );
            }
            // Check if Footer menu exists and make it if not
            if ( !is_nav_menu( 'Footer' )) {
                $menu_id = wp_create_nav_menu( 'Footer' );
                $menu = array( 'menu-item-type' => 'custom', 'menu-item-url' => get_home_url('/'), 'menu-item-title' => 'Home' );
                wp_update_nav_menu_item( $menu_id, 0, $menu );
            }
    
            // Get any menu locations that dont have a menu assigned to it and give it on
            /* Currently not working. couldnt fix it.
            $loc = array('Top', 'Header', 'Footer');
            if ( has_nav_menu( $location )) {
                $locations = get_nav_menu_locations();
                return (!empty( $locations[ $location ] ));
            }
            */
        }
        /* Delete nav menu in case you need it
        wp_delete_nav_menu( $menu );
        */
    
  2. For anyone seeking the same solution, here is the code:

    function register_my_menus() {
    
        $menus = array(
            'Main menu' => array(
                'slug' => 'main-menu',
                'menu_items' => array(
                    'Home' => site_url(),
                    'Search' => site_url('/search/'),
                    'Online now' => site_url('online-now'),
                    'Video Chat' => site_url('/video-chat/'),
                    'Galleries' => site_url('/galleries/'),
                    'Forums' => site_url('/forums/'),
                    'Live cams' => site_url('/live-cams/')
                )
            )
        );
    
        foreach($menus as $menu_title => $menu_var) {
            register_nav_menu( $menu_var['slug'], $menu_title );
            if( !is_nav_menu($menu_title) ) {
                $menu_id = wp_create_nav_menu( $menu_title );
                foreach( $menu_var['menu_items'] as $menu_item_name => $menu_item_url ) {
                    $item = array ( 'menu-item-type' => 'custom', 'menu-item-url' => $menu_item_url, 'menu-item-title' => $menu_item_name );
                    wp_update_nav_menu_item( $menu_id, 0, $item );
                }
            }
         }
    }
    
    add_action( 'init', 'register_my_menus' );
    

    All you need to do is modify the $menus array. 🙂