Parsed: 126558

function switch_theme( $stylesheet ) {
  global $wp_theme_directories, $wp_customize, $sidebars_widgets, $wp_registered_sidebars;

  $requirements = validate_theme_requirements( $stylesheet );
  if ( is_wp_error( $requirements ) ) {
    wp_die( $requirements );
  }

  $_sidebars_widgets = null;
  if ( 'wp_ajax_customize_save' === current_action() ) {
    $old_sidebars_widgets_data_setting = $wp_customize->get_setting( 'old_sidebars_widgets_data' );
    if ( $old_sidebars_widgets_data_setting ) {
      $_sidebars_widgets = $wp_customize->post_value( $old_sidebars_widgets_data_setting );
    }
  } elseif ( is_array( $sidebars_widgets ) ) {
    $_sidebars_widgets = $sidebars_widgets;
  }

  if ( is_array( $_sidebars_widgets ) ) {
    set_theme_mod(
      'sidebars_widgets',
      array(
        'time' => time(),
        'data' => $_sidebars_widgets,
      )
    );
  }

  $nav_menu_locations = get_theme_mod( 'nav_menu_locations' );
  update_option( 'theme_switch_menu_locations', $nav_menu_locations );

  if ( func_num_args() > 1 ) {
    $stylesheet = func_get_arg( 1 );
  }

  $old_theme = wp_get_theme();
  $new_theme = wp_get_theme( $stylesheet );
  $template  = $new_theme->get_template();

  if ( wp_is_recovery_mode() ) {
    $paused_themes = wp_paused_themes();
    $paused_themes->delete( $old_theme->get_stylesheet() );
    $paused_themes->delete( $old_theme->get_template() );
  }

  update_option( 'template', $template );
  update_option( 'stylesheet', $stylesheet );

  if ( count( $wp_theme_directories ) > 1 ) {
    update_option( 'template_root', get_raw_theme_root( $template, true ) );
    update_option( 'stylesheet_root', get_raw_theme_root( $stylesheet, true ) );
  } else {
    delete_option( 'template_root' );
    delete_option( 'stylesheet_root' );
  }

  $new_name = $new_theme->get( 'Name' );

  update_option( 'current_theme', $new_name );

  // Migrate from the old mods_{name} option to theme_mods_{slug}.
  if ( is_admin() && false === get_option( 'theme_mods_' . $stylesheet ) ) {
    $default_theme_mods = (array) get_option( 'mods_' . $new_name );
    if ( ! empty( $nav_menu_locations ) && empty( $default_theme_mods['nav_menu_locations'] ) ) {
      $default_theme_mods['nav_menu_locations'] = $nav_menu_locations;
    }
    add_option( "theme_mods_$stylesheet", $default_theme_mods );
  } else {
    /*
		 * Since retrieve_widgets() is called when initializing a theme in the Customizer,
		 * we need to remove the theme mods to avoid overwriting changes made via
		 * the Customizer when accessing wp-admin/widgets.php.
		 */
    if ( 'wp_ajax_customize_save' === current_action() ) {
      remove_theme_mod( 'sidebars_widgets' );
    }
  }

  // Stores classic sidebars for later use by block themes.
  if ( $new_theme->is_block_theme() ) {
    set_theme_mod( 'wp_classic_sidebars', $wp_registered_sidebars );
  }

  update_option( 'theme_switched', $old_theme->get_stylesheet() );

  // Clear pattern caches.
  $new_theme->delete_pattern_cache();
  $old_theme->delete_pattern_cache();

  
/**
 * Fires after the theme is switched.
 *
 * See {@see 'after_switch_theme'}.
 *
 * @since 1.5.0
 * @since 4.5.0 Introduced the `$old_theme` parameter.
 *
 * @param string   $new_name  Name of the new theme.
 * @param WP_Theme $new_theme WP_Theme instance of the new theme.
 * @param WP_Theme $old_theme WP_Theme instance of the old theme.
 */
  do_action( 'switch_theme', $new_name, $new_theme, $old_theme );
}