switch_theme( string $stylesheet )

Switches the theme.


Description Description

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.


Parameters Parameters

$stylesheet

(string) (Required) Stylesheet name


Top ↑

Source Source

File: wp-includes/theme.php

713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
function switch_theme( $stylesheet ) {
    global $wp_theme_directories, $wp_customize, $sidebars_widgets;
 
    $_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();
 
    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' );
        }
    }
 
    update_option( 'theme_switched', $old_theme->get_stylesheet() );
 
    /**
     * Fires after the theme is switched.
     *
     * @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 );
}

Top ↑

Changelog Changelog

Changelog
Version Description
2.5.0 Introduced.


Top ↑

User Contributed Notes User Contributed Notes

You must log in before being able to contribute a note or feedback.