Assign Menus to Theme Locations with theme activation

A site is using “child1” named child theme. When this site switches to other child theme named “child2”, their widgets are moving too but theme locations are not moving. How can i auto assign menus to theme locations on theme activation?

I found this solution from http://wordpress.org/support/topic/how-to-assign-a-wordpress-3-menu-to-primary-location-programmatically

Read More
$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);

Is there any better wordpress way to fix this?
(Related trac topic: http://core.trac.wordpress.org/ticket/18720 )

Related posts

Leave a Reply

2 comments

  1. Well,
    I wrote a solution so writing it here:

    /* 
     This action copies old theme's theme location saves to 
     new theme if new theme doesnt have saves before.
     */
     add_action( 'after_switch_theme',  'ajx_theme_locations_rescue' );
     function ajx_theme_locations_rescue() {
        // bug report / support: http://www.unsalkorkmaz.com/
        // We got old theme's slug name
        $old_theme = get_option( 'theme_switched' );
        // Getting old theme's settings
        $old_theme_mods = get_option("theme_mods_{$old_theme}");
        // Getting old theme's theme location settings
        $old_theme_navs = $old_theme_mods['nav_menu_locations'];
        // Getting new theme's theme location settings
        $new_theme_navs = get_theme_mod( 'nav_menu_locations' );
    
        // If new theme's theme location is empty (its not empty if theme was activated and set some theme locations before)
        if (!$new_theme_navs) {
            // Getting registered theme locations on new theme
            $new_theme_locations = get_registered_nav_menus();
    
            foreach ($new_theme_locations as $location => $description ) {
                // We setting same nav menus for each theme location 
                $new_theme_navs[$location] = $old_theme_navs[$location];
            }
    
            set_theme_mod( 'nav_menu_locations', $new_theme_navs );
    
        }
     }
    
  2. I know you had this issue long time ago but since this site popped up with the first few, I thought to share my solution in case someone needs it.

    Either in your setup file or in your general functions.php, update and include the following code:

    // This theme uses wp_nav_menu() in one location.
    register_nav_menu( 'primary', __( 'Primary Menu', 'theme-slug' ) );
    
    // get 'your_custom_menu' id to assign it to the primary menu location created
    $menu_header = get_term_by('name', 'your_custom_menu', 'nav_menu');
    $menu_header_id = $menu_header->term_id;
    
    // if menu not found, create a new one
    if($menu_header_id == 0) {
         $menu_header_id = wp_create_nav_menu('your_custom_menu');
    }
    
    //Get all locations (including the one we just created above)
    $locations = get_theme_mod('nav_menu_locations');
    
    // set the menu to the new location and save into database
    $locations['primary'] = $menu_header_id;
    set_theme_mod( 'nav_menu_locations', $locations );