WordPress.org

Ready to get started?Download WordPress

Forums

[resolved] How to assign a WordPress 3 menu to "Primary" location programmatically? (9 posts)

  1. Agus Suhanto
    Member
    Posted 4 years ago #

    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' => 'http://suhanto.net', '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?

  2. Agus Suhanto
    Member
    Posted 4 years ago #

    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.

  3. Agus Suhanto
    Member
    Posted 4 years ago #

    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

  4. arteedecco
    Member
    Posted 3 years ago #

    Agus,

    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: http://codex.wordpress.org/Function_Reference/register_nav_menus

    In the documentation for wp_nav_menu() it specifies that you display a menu from a specified theme_location; documentation here: http://codex.wordpress.org/Function_Reference/wp_nav_menu

    Hopefully I understood your goal correctly?

  5. adaldesign
    Member
    Posted 3 years ago #

    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?

  6. adaldesign
    Member
    Posted 3 years ago #

    Has anyone found solutions to the unresolved points above?

  7. Jason Lemahieu (MadtownLems)
    Member
    Posted 3 years ago #

    adaldesign:
    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.

  8. adaldesign
    Member
    Posted 3 years ago #

    Thanks MadtownLems,

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

  9. Jason Lemahieu (MadtownLems)
    Member
    Posted 3 years ago #

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

Topic Closed

This topic has been closed to new replies.

About this Topic