WordPress Version: 6.5
/**
* Switches the theme.
*
* Accepts one argument: $stylesheet of the theme. It also accepts an additional function signature
* of two arguments: $template then $stylesheet. This is for backward compatibility.
*
* @since 2.5.0
*
* @global array $wp_theme_directories
* @global WP_Customize_Manager $wp_customize
* @global array $sidebars_widgets
* @global array $wp_registered_sidebars
*
* @param string $stylesheet Stylesheet name.
*/
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 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());
/*
* Reset template globals when switching themes outside of a switched blog
* context to ensure templates will be loaded from the new theme.
*/
if (!is_multisite() || !ms_is_switched()) {
wp_set_template_globals();
}
// Clear pattern caches.
if (!is_multisite()) {
$new_theme->delete_pattern_cache();
$old_theme->delete_pattern_cache();
}
// Set autoload=no for the old theme, autoload=yes for the switched theme.
$theme_mods_options = array('theme_mods_' . $stylesheet => 'yes', 'theme_mods_' . $old_theme->get_stylesheet() => 'no');
wp_set_option_autoload_values($theme_mods_options);
/**
* 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);
}