Assign Menus to Theme Locations with theme activation

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

    }
 }

Leave a Comment