WordPress.org

Make WordPress Core

Ticket #19846: 19846.diff

File 19846.diff, 4.2 KB (added by welcher, 3 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