WordPress.org

Make WordPress Core

Ticket #17979: 17979.2.diff

File 17979.2.diff, 7.0 KB (added by aaroncampbell, 6 years ago)
  • wp-admin/widgets.php

     
    6262if ( empty( $sidebars_widgets ) ) 
    6363        $sidebars_widgets = wp_get_widget_defaults(); 
    6464 
    65 // look for "lost" widgets, this has to run at least on each theme change 
    66 function retrieve_widgets() { 
    67         global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; 
    68  
    69         $_sidebars_widgets = array(); 
    70         $sidebars = array_keys($wp_registered_sidebars); 
    71  
    72         unset( $sidebars_widgets['array_version'] ); 
    73  
    74         $old = array_keys($sidebars_widgets); 
    75         sort($old); 
    76         sort($sidebars); 
    77  
    78         if ( $old == $sidebars ) 
    79                 return; 
    80  
    81         // Move the known-good ones first 
    82         foreach ( $sidebars as $id ) { 
    83                 if ( array_key_exists( $id, $sidebars_widgets ) ) { 
    84                         $_sidebars_widgets[$id] = $sidebars_widgets[$id]; 
    85                         unset($sidebars_widgets[$id], $sidebars[$id]); 
    86                 } 
    87         } 
    88  
    89         // if new theme has less sidebars than the old theme 
    90         if ( !empty($sidebars_widgets) ) { 
    91                 foreach ( $sidebars_widgets as $lost => $val ) { 
    92                         if ( is_array($val) ) 
    93                                 $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val ); 
    94                 } 
    95         } 
    96  
    97         // discard invalid, theme-specific widgets from sidebars 
    98         $shown_widgets = array(); 
    99         foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 
    100                 if ( !is_array($widgets) ) 
    101                         continue; 
    102  
    103                 $_widgets = array(); 
    104                 foreach ( $widgets as $widget ) { 
    105                         if ( isset($wp_registered_widgets[$widget]) ) 
    106                                 $_widgets[] = $widget; 
    107                 } 
    108                 $_sidebars_widgets[$sidebar] = $_widgets; 
    109                 $shown_widgets = array_merge($shown_widgets, $_widgets); 
    110         } 
    111  
    112         $sidebars_widgets = $_sidebars_widgets; 
    113         unset($_sidebars_widgets, $_widgets); 
    114  
    115         // find hidden/lost multi-widget instances 
    116         $lost_widgets = array(); 
    117         foreach ( $wp_registered_widgets as $key => $val ) { 
    118                 if ( in_array($key, $shown_widgets, true) ) 
    119                         continue; 
    120  
    121                 $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); 
    122  
    123                 if ( 2 > (int) $number ) 
    124                         continue; 
    125  
    126                 $lost_widgets[] = $key; 
    127         } 
    128  
    129         $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 
    130         wp_set_sidebars_widgets($sidebars_widgets); 
    131 } 
    13265retrieve_widgets(); 
    13366 
    13467if ( count($wp_registered_sidebars) == 1 ) { 
  • wp-includes/default-filters.php

     
    215215add_action( 'wp_footer',           'wp_print_footer_scripts'              ); 
    216216add_action( 'wp_head',             'wp_shortlink_wp_head',          10, 0 ); 
    217217add_action( 'template_redirect',   'wp_shortlink_header',           11, 0 ); 
     218add_action( 'init',                'check_theme_switched',          99    ); 
    218219 
    219220if ( isset( $_GET['replytocom'] ) ) 
    220221    add_filter( 'pre_option_blog_public', '__return_zero' ); 
  • wp-includes/theme.php

     
    12601260                $default_theme_mods = (array) get_option( "mods_$theme" ); 
    12611261                add_option( "theme_mods_$stylesheet", $default_theme_mods ); 
    12621262        } 
    1263         do_action('switch_theme', $theme); 
     1263        update_option( 'theme_switched', 'true' ); 
     1264        do_action( 'switch_theme', $theme ); 
    12641265} 
    12651266 
    12661267/** 
  • wp-includes/widgets.php

     
    10551055                                unset($_sidebars_widgets); 
    10561056 
    10571057                        case 2 : 
    1058                                 $sidebars = array_keys( $wp_registered_sidebars ); 
    1059                                 if ( !empty( $sidebars ) ) { 
    1060                                         // Move the known-good ones first 
    1061                                         foreach ( (array) $sidebars as $id ) { 
    1062                                                 if ( array_key_exists( $id, $sidebars_widgets ) ) { 
    1063                                                         $_sidebars_widgets[$id] = $sidebars_widgets[$id]; 
    1064                                                         unset($sidebars_widgets[$id], $sidebars[$id]); 
    1065                                                 } 
    1066                                         } 
    1067  
    1068                                         // move the rest to wp_inactive_widgets 
    1069                                         if ( !isset($_sidebars_widgets['wp_inactive_widgets']) ) 
    1070                                                 $_sidebars_widgets['wp_inactive_widgets'] = array(); 
    1071  
    1072                                         if ( !empty($sidebars_widgets) ) { 
    1073                                                 foreach ( $sidebars_widgets as $lost => $val ) { 
    1074                                                         if ( is_array($val) ) 
    1075                                                                 $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val ); 
    1076                                                 } 
    1077                                         } 
    1078  
    1079                                         $sidebars_widgets = $_sidebars_widgets; 
    1080                                         unset($_sidebars_widgets); 
    1081                                 } 
     1058                                $sidebars_widgets = retrieve_widgets(); 
    10821059                } 
    10831060        } 
    10841061 
     
    12151192function _get_widget_id_base($id) { 
    12161193        return preg_replace( '/-[0-9]+$/', '', $id ); 
    12171194} 
     1195 
     1196function check_theme_switched() { 
     1197        if ( get_option( 'theme_switched' ) ) { 
     1198                retrieve_widgets(); 
     1199                update_option( 'theme_switched', false ); 
     1200        } 
     1201} 
     1202// look for "lost" widgets, this has to run at least on each theme change 
     1203function retrieve_widgets() { 
     1204        global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; 
     1205 
     1206        if ( ! is_array( $sidebars_widgets ) ) 
     1207                $sidebars_widgets = wp_get_sidebars_widgets(); 
     1208 
     1209        $sidebars = array_keys($wp_registered_sidebars); 
     1210 
     1211        unset( $sidebars_widgets['array_version'] ); 
     1212 
     1213        $old = array_keys($sidebars_widgets); 
     1214        sort($old); 
     1215        sort($sidebars); 
     1216 
     1217        if ( $old == $sidebars ) 
     1218                return; 
     1219 
     1220 
     1221        $_sidebars_widgets = array( 
     1222                'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets'] 
     1223        ); 
     1224        unset( $sidebars_widgets['wp_inactive_widgets'] ); 
     1225        foreach ( $wp_registered_sidebars as $id => $settings ) { 
     1226                if ( empty( $first_id ) ) 
     1227                        $first_id = $id; 
     1228                if ( ! empty( $sidebars_widgets ) ) 
     1229                        $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); 
     1230        } 
     1231        if ( ! empty( $sidebars_widgets ) ){ 
     1232                foreach( $sidebars_widgets as $leftover_sidebar ) 
     1233                        $_sidebars_widgets[$first_id] = array_merge( (array) $_sidebars_widgets[$first_id], $leftover_sidebar ); 
     1234        } 
     1235 
     1236        // discard invalid, theme-specific widgets from sidebars 
     1237        $shown_widgets = array(); 
     1238        foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 
     1239                if ( !is_array($widgets) ) 
     1240                        continue; 
     1241 
     1242                $_widgets = array(); 
     1243                foreach ( $widgets as $widget ) { 
     1244                        if ( isset($wp_registered_widgets[$widget]) ) 
     1245                                $_widgets[] = $widget; 
     1246                } 
     1247                $_sidebars_widgets[$sidebar] = $_widgets; 
     1248                $shown_widgets = array_merge($shown_widgets, $_widgets); 
     1249        } 
     1250 
     1251        $sidebars_widgets = $_sidebars_widgets; 
     1252        unset($_sidebars_widgets, $_widgets); 
     1253 
     1254        // find hidden/lost multi-widget instances 
     1255        $lost_widgets = array(); 
     1256        foreach ( $wp_registered_widgets as $key => $val ) { 
     1257                if ( in_array($key, $shown_widgets, true) ) 
     1258                        continue; 
     1259 
     1260                $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); 
     1261 
     1262                if ( 2 > (int) $number ) 
     1263                        continue; 
     1264 
     1265                $lost_widgets[] = $key; 
     1266        } 
     1267 
     1268        $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 
     1269        wp_set_sidebars_widgets($sidebars_widgets); 
     1270        return $sidebars_widgets; 
     1271}