WordPress.org

Make WordPress Core

Ticket #19291: 19291.patch

File 19291.patch, 2.7 KB (added by lancewillett, 3 years ago)
  • wp-includes/widgets.php

     
    11641164function retrieve_widgets() { 
    11651165        global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; 
    11661166 
    1167         $_sidebars_widgets = array(); 
    1168         $sidebars = array_keys($wp_registered_sidebars); 
     1167        $registered_sidebar_keys = array_keys( $wp_registered_sidebars ); 
     1168 
     1169        $orphaned = 0; 
     1170 
    11691171        $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' ); 
    11701172        if ( is_array( $old_sidebars_widgets ) ) { 
    11711173                // time() that sidebars were stored is in $old_sidebars_widgets['time'] 
    1172                 $old_sidebars = $old_sidebars_widgets['data']; 
     1174                $_sidebars_widgets = $old_sidebars_widgets['data']; 
     1175                remove_theme_mod( 'sidebars_widgets' ); 
    11731176 
    1174                 // make sure the saved sidebars match 
    1175                 foreach ( $sidebars as $sidebar_id ) { 
    1176                         $_sidebars_widgets[$sidebar_id] = isset($old_sidebars[$sidebar_id]) ? $old_sidebars[$sidebar_id] : array(); 
     1177                foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 
     1178                        if ( 'wp_inactive_widgets' == $sidebar || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) 
     1179                                continue; 
     1180 
     1181                        if ( !in_array( $sidebar, $registered_sidebar_keys ) ) { 
     1182                                $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $widgets; 
     1183                                unset( $_sidebars_widgets[$sidebar] ); 
     1184                        } 
    11771185                } 
    1178  
    1179                 remove_theme_mod( 'sidebars_widgets' ); 
    11801186        } else { 
    11811187                if ( empty( $sidebars_widgets ) ) 
    11821188                        return; 
     
    11851191 
    11861192                $old = array_keys($sidebars_widgets); 
    11871193                sort($old); 
    1188                 sort($sidebars); 
     1194                sort($registered_sidebar_keys); 
    11891195 
    1190                 if ( $old == $sidebars ) 
     1196                if ( $old == $registered_sidebar_keys ) 
    11911197                        return; 
    11921198 
    11931199                $_sidebars_widgets = array( 
     
    11991205                foreach ( $wp_registered_sidebars as $id => $settings ) 
    12001206                        $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); 
    12011207 
    1202                 $orphaned = 0; 
    1203  
    12041208                foreach ( $sidebars_widgets as $val ) { 
    12051209                        if ( is_array($val) && ! empty( $val ) ) 
    12061210                                $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val; 
     
    12281232        unset($_sidebars_widgets, $_widgets); 
    12291233 
    12301234        // find hidden/lost multi-widget instances 
    1231         $lost_widgets = array(); 
    12321235        foreach ( $wp_registered_widgets as $key => $val ) { 
    12331236                if ( in_array($key, $shown_widgets, true) ) 
    12341237                        continue; 
     
    12381241                if ( 2 > (int) $number ) 
    12391242                        continue; 
    12401243 
    1241                 $lost_widgets[] = $key; 
     1244                // Any lost widgets from previous sidebars become orphans 
     1245                $sidebars_widgets['orphaned_widgets_' . ++$orphaned] = array( $key ); 
    12421246        } 
    12431247 
    1244         $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 
    12451248        wp_set_sidebars_widgets($sidebars_widgets); 
    12461249 
    12471250        return $sidebars_widgets;