WordPress.org

Make WordPress Core

Ticket #19846: 19846.diff

File 19846.diff, 4.2 KB (added by welcher, 2 years ago)
  • src/wp-includes/theme.php

     
    675675 * @param string $stylesheet Stylesheet name 
    676676 */ 
    677677function switch_theme( $stylesheet ) { 
    678         global $wp_theme_directories, $wp_customize, $sidebars_widgets; 
     678        global $wp_theme_directories, $wp_customize, $sidebars_widgets, $wp_registered_sidebars; 
    679679 
     680        $primary_sidebars = wp_get_primary_widget_areas( $wp_registered_sidebars ); 
     681        if ( $primary_sidebars && ! empty( $primary_sidebars ) ) { 
     682                set_transient( 'old_primary_sidebars', $primary_sidebars, MINUTE_IN_SECONDS ); 
     683        } 
     684 
    680685        $_sidebars_widgets = null; 
    681686        if ( 'wp_ajax_customize_save' === current_action() ) { 
    682687                $_sidebars_widgets = $wp_customize->post_value( $wp_customize->get_setting( 'old_sidebars_widgets_data' ) ); 
  • src/wp-includes/widget-functions.php

     
    165165                'after_widget' => "</li>\n", 
    166166                'before_title' => '<h2 class="widgettitle">', 
    167167                'after_title' => "</h2>\n", 
     168                'is_primary' => false, 
    168169        ); 
    169170 
    170171        $sidebar = wp_parse_args( $args, $defaults ); 
     
    997998 
    998999        $registered_sidebar_keys = array_keys( $wp_registered_sidebars ); 
    9991000        $orphaned = 0; 
     1001        $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' ); 
     1002        $old_primary_areas    = get_transient( 'old_primary_sidebars' ); 
     1003        delete_transient( 'old_primary_sidebars' ); 
    10001004 
    1001         $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' ); 
     1005 
    10021006        if ( is_array( $old_sidebars_widgets ) ) { 
    10031007                // time() that sidebars were stored is in $old_sidebars_widgets['time'] 
    10041008                $_sidebars_widgets = $old_sidebars_widgets['data']; 
     
    10361040 
    10371041                unset( $sidebars_widgets['wp_inactive_widgets'] ); 
    10381042 
     1043                $primary_areas      = wp_get_primary_widget_areas( $wp_registered_sidebars ); 
     1044                $primary_widget     = ( $primary_areas && isset( $primary_areas[0] ) ) ?  $primary_areas[0] : false; 
     1045                $old_primary_widget = ( $old_primary_areas && isset( $old_primary_areas[0] ) ) ? $old_primary_areas[0]: false; 
     1046 
     1047                if ( $theme_changed ) { 
     1048                        if ( $primary_widget && $old_primary_widget ) { 
     1049                                $_sidebars_widgets[ $primary_widget ] = $sidebars_widgets[ $old_primary_widget ]; 
     1050                                unset( $sidebars_widgets[ $old_primary_widget ] ); 
     1051                        } else if( $primary_widget ) { 
     1052                                //there was no old primary widget area - let's assume the first one should be the primary 
     1053                                        $sidebar_keys                         = array_keys( $sidebars_widgets ); 
     1054                                        $first_sidebar                        = $sidebars_widgets[ $sidebar_keys[0] ]; 
     1055                                        $_sidebars_widgets[ $primary_widget ] = $first_sidebar; 
     1056                                        unset( $sidebars_widgets[ $sidebar_keys[0] ] ); 
     1057                        } 
     1058                } 
     1059 
    10391060                foreach ( $wp_registered_sidebars as $id => $settings ) { 
    10401061                        if ( $theme_changed ) { 
    1041                                 $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); 
     1062                                //we've attempted to handle the primary widget area above - now do the others 
     1063                                $_sidebars_widgets[ $id ] = array_shift( $sidebars_widgets ); 
    10421064                        } else { 
    10431065                                // no theme change, grab only sidebars that are currently registered 
    1044                                 if ( isset( $sidebars_widgets[$id] ) ) { 
    1045                                         $_sidebars_widgets[$id] = $sidebars_widgets[$id]; 
    1046                                         unset( $sidebars_widgets[$id] ); 
     1066                                if ( isset( $sidebars_widgets[ $id ] ) ) { 
     1067                                        $_sidebars_widgets[ $id ] = $sidebars_widgets[ $id ]; 
     1068                                        unset( $sidebars_widgets[ $id ] ); 
    10471069                                } 
    10481070                        } 
    10491071                } 
    10501072 
     1073 
     1074 
     1075 
    10511076                foreach ( $sidebars_widgets as $val ) { 
    10521077                        if ( is_array($val) && ! empty( $val ) ) 
    10531078                                $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val; 
     
    10971122} 
    10981123 
    10991124/** 
     1125 * Retrieve the list of registered sidebars marked as primary. 
     1126 * 
     1127 * @since 4.4.0 
     1128 * 
     1129 * @param array $wp_registered_sidebars The list of currently registered sidebars. 
     1130 * @return array 
     1131 */ 
     1132function wp_get_primary_widget_areas( $wp_registered_sidebars ) { 
     1133        $primary_list = array(); 
     1134        foreach( $wp_registered_sidebars as $sidebar_name => $sidebar_details ) { 
     1135                if ( true === $sidebar_details['is_primary'] ) { 
     1136                        $primary_list[] = $sidebar_name; 
     1137                } 
     1138        } 
     1139        return $primary_list; 
     1140} 
     1141 
     1142/** 
    11001143 * Display the RSS entries in a list. 
    11011144 * 
    11021145 * @since 2.5.0