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

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


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

  • 1
    i tried all possibilities and it seems working but please if u want to use it, try as much as possible and if its working or not, write here. – Ünsal Korkmaz Jul 12 '12 at 16:19

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.

  • 1
    While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. – Gabriel Jan 14 '16 at 16:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.