Support » Plugins » How to assign a WordPress 3 menu to “Primary” location programmatically?

  • Resolved Agus Suhanto


    I’m trying to create WordPress 3 menu programmatically.

    Here is the code that I wrote to make it:

    $menu_id = wp_create_nav_menu('my_menu');
    wp_update_nav_menu_item($menu_id, 0, array('menu-item-title' => 'First Menu Item', 'menu-item-url' => '', 'menu-item-status' => 'publish'));

    and now I want to assign the $menu_id to “Primary” navigation location. I already looked into the source code in wp-includes/nav-menu.php and wp-includes/nav-menu-template.php and so far I haven’t found a function that achieves that goal.

    So, anyone know how to assign a menu id to “primary” navigation location programmatically in WordPress 3.0?

Viewing 8 replies - 1 through 8 (of 8 total)
  • After some hours looking into the code and performing trial and errors, lately I found out that the ‘assignment’ of menu to a ‘theme location’ is not the responsibility of the nav_menu API in WordPress 3.0. But it belong to theme options.

    So, then I added the following source code to source code above to achieve my goal:

    $theme = get_current_theme();
    $mods = get_option("mods_$theme");
    $key = key($mods['nav_menu_locations']);
    $mods['nav_menu_locations'][$key] = $menu_id;
    update_option("mods_$theme", $mods);

    Note: the source code above make an assumption that there is at least one registered menu location in a theme, and the first menu location is the target of operation of $menu_id assignment.

    Explanation about solution to this problem in the context of creating menu and menu items programmatically can be read here: Creating Menu in WordPress 3.0 Programmatically


    Thanks for your posts! I was just looking into the menu stuff as well and wanted a way to create a menu dynamically without having to use the WP Admin interface.

    In reference to how to assign your new menu to a specific location.

    I *think* you need to register your new menu using:
    register_nav_menu() <– single menu
    register_nav_menus() <– multiple menus

    You assign a location for a menu via register_nav_menus(), documentation here:

    In the documentation for wp_nav_menu() it specifies that you display a menu from a specified theme_location; documentation here:

    Hopefully I understood your goal correctly?

    Agus’s solution is close but not quite there yet. I want to be able to programmatically create several (say 2) theme locations, then create 2 menus and assign them to the specific locations of my choice.
    Then I want to create pages and assign them to the menus of my choice.

    I’ve spent hours looking at blog posts, WordPress Docs and the WordPress source code.

    So far I have compiled:

    //Create a Page (home page in this case)
    global $user_ID;
    $home_page = array(
      'post_type' => 'page',
      'post_name' => 'home',
      'post_title' => 'Home',
      'post_content' => '<h1>Hello there!</h1>',
      'menu_order' => 0,
      'post_status' => 'publish',
      'comment_status' => 'closed',
      'ping_status' => 'closed',
    wp_insert_post( $home_page );
    // Register menu locations
    function register_my_menus() { register_nav_menus(
        array( 'header' => __( 'Header Menu' ), 'footer' => __( 'Footer Menu' ))
      ); }
    add_action( 'init', 'register_my_menus' );
    // Create Menus
    wp_create_nav_menu( 'Header Top Nav', array( 'slug' => 'header-menu' ) );
    wp_create_nav_menu( 'Footer Bottom Nav', array( 'slug' => 'footer-menu' ) );

    But missing is the ability to:

    – Assign created menus to created theme locations
    – Create menu items in created menus linking to created pages.

    For the first request… Agus’s suggestion is nice but fails to let me assign the menu of my choice to the location of my choice. The key here seems to be able to get a menu’s ID from it’s slug.

    For the second missing link, the Docs say you can use wp_insert_post to add a ‘nav_menu_item’, but there are no instructions on how to actually accomplish this. Sure I can add a post to the database, but how to I link it’s metadata to the correct post?

    Has anyone found solutions to the unresolved points above?

    I’m still working on assigning menus to theme locations, but I believe it’s done using set_theme_mod.

    To add menu items that point to existing pages, you’ll want to call wp_update_nav_menu_item

    The source in core is documented fairly well with the attributes.

    Thanks MadtownLems,

    When I get an hour or two of free time I’ll dive back into this using those leads!

    For setting theme locations:

    $locations = get_theme_mod('nav_menu_locations');
    $locations['location-name'] = $foo.  //$foo is term_id of menu
    set_theme_mod('nav_menu_locations', $locations);
Viewing 8 replies - 1 through 8 (of 8 total)
  • The topic ‘How to assign a WordPress 3 menu to “Primary” location programmatically?’ is closed to new replies.