WordPress.org

Make WordPress Core

Ticket #17979: 17979.7.diff

File 17979.7.diff, 8.8 KB (added by aaroncampbell, 3 years ago)
  • wp-admin/widgets.php

     
    4444$help .= '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'; 
    4545add_contextual_help($current_screen, $help); 
    4646 
     47// These are the widgets grouped by sidebar 
     48$sidebars_widgets = wp_get_sidebars_widgets(); 
     49 
     50if ( empty( $sidebars_widgets ) ) 
     51        $sidebars_widgets = wp_get_widget_defaults(); 
     52 
    4753// register the inactive_widgets area as sidebar 
    4854register_sidebar(array( 
    4955        'name' => __('Inactive Widgets'), 
     
    5561        'after_title' => '', 
    5662)); 
    5763 
    58 // These are the widgets grouped by sidebar 
    59 $sidebars_widgets = wp_get_sidebars_widgets(); 
    60 if ( empty( $sidebars_widgets ) ) 
    61         $sidebars_widgets = wp_get_widget_defaults(); 
    62  
    63 // look for "lost" widgets, this has to run at least on each theme change 
    64 function retrieve_widgets() { 
    65         global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; 
    66  
    67         $_sidebars_widgets = array(); 
    68         $sidebars = array_keys($wp_registered_sidebars); 
    69  
    70         unset( $sidebars_widgets['array_version'] ); 
    71  
    72         $old = array_keys($sidebars_widgets); 
    73         sort($old); 
    74         sort($sidebars); 
    75  
    76         if ( $old == $sidebars ) 
    77                 return; 
    78  
    79         // Move the known-good ones first 
    80         foreach ( $sidebars as $id ) { 
    81                 if ( array_key_exists( $id, $sidebars_widgets ) ) { 
    82                         $_sidebars_widgets[$id] = $sidebars_widgets[$id]; 
    83                         unset($sidebars_widgets[$id], $sidebars[$id]); 
    84                 } 
     64foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { 
     65        if ( empty( $wp_registered_sidebars[ $sidebar_id ] ) && ! empty( $widgets ) ) { 
     66                // register the inactive_widgets area as sidebar 
     67                register_sidebar(array( 
     68                        'name' => __('Orphaned Widgets'), 
     69                        'id' => $sidebar_id, 
     70                        'description' => '', 
     71                        'before_widget' => '', 
     72                        'after_widget' => '', 
     73                        'before_title' => '', 
     74                        'after_title' => '', 
     75                )); 
    8576        } 
    86  
    87         // if new theme has less sidebars than the old theme 
    88         if ( !empty($sidebars_widgets) ) { 
    89                 foreach ( $sidebars_widgets as $lost => $val ) { 
    90                         if ( is_array($val) ) 
    91                                 $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val ); 
    92                 } 
    93         } 
    94  
    95         // discard invalid, theme-specific widgets from sidebars 
    96         $shown_widgets = array(); 
    97         foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 
    98                 if ( !is_array($widgets) ) 
    99                         continue; 
    100  
    101                 $_widgets = array(); 
    102                 foreach ( $widgets as $widget ) { 
    103                         if ( isset($wp_registered_widgets[$widget]) ) 
    104                                 $_widgets[] = $widget; 
    105                 } 
    106                 $_sidebars_widgets[$sidebar] = $_widgets; 
    107                 $shown_widgets = array_merge($shown_widgets, $_widgets); 
    108         } 
    109  
    110         $sidebars_widgets = $_sidebars_widgets; 
    111         unset($_sidebars_widgets, $_widgets); 
    112  
    113         // find hidden/lost multi-widget instances 
    114         $lost_widgets = array(); 
    115         foreach ( $wp_registered_widgets as $key => $val ) { 
    116                 if ( in_array($key, $shown_widgets, true) ) 
    117                         continue; 
    118  
    119                 $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); 
    120  
    121                 if ( 2 > (int) $number ) 
    122                         continue; 
    123  
    124                 $lost_widgets[] = $key; 
    125         } 
    126  
    127         $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 
    128         wp_set_sidebars_widgets($sidebars_widgets); 
    12977} 
     78 
    13079retrieve_widgets(); 
    13180 
    13281if ( count($wp_registered_sidebars) == 1 ) { 
  • wp-includes/default-filters.php

     
    217217add_action( 'wp_footer',           'wp_print_footer_scripts'                ); 
    218218add_action( 'wp_head',             'wp_shortlink_wp_head',            10, 0 ); 
    219219add_action( 'template_redirect',   'wp_shortlink_header',             11, 0 ); 
     220add_action( 'init',                'check_theme_switched',            99    ); 
    220221 
    221222if ( isset( $_GET['replytocom'] ) ) 
    222223    add_filter( 'pre_option_blog_public', '__return_zero' ); 
     
    284285 
    285286unset($filter, $action); 
    286287 
    287 ?> 
    288  No newline at end of file 
     288?> 
  • wp-includes/theme.php

     
    12481248function switch_theme($template, $stylesheet) { 
    12491249        global $wp_theme_directories; 
    12501250 
     1251        $old_theme = get_current_theme(); 
     1252 
    12511253        update_option('template', $template); 
    12521254        update_option('stylesheet', $stylesheet); 
    12531255        if ( count($wp_theme_directories) > 1 ) { 
     
    12601262                $default_theme_mods = (array) get_option( "mods_$theme" ); 
    12611263                add_option( "theme_mods_$stylesheet", $default_theme_mods ); 
    12621264        } 
    1263         do_action('switch_theme', $theme); 
     1265        update_option( 'theme_switched', $old_theme ); 
     1266        do_action( 'switch_theme', $theme ); 
    12641267} 
    12651268 
    12661269/** 
  • 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 ( false !== ( $old_theme = get_option( 'theme_switched' ) ) && !empty( $old_theme ) ) { 
     1198                global $sidebars_widgets; 
     1199 
     1200                if ( ! is_array( $sidebars_widgets ) ) 
     1201                        $sidebars_widgets = wp_get_sidebars_widgets(); 
     1202 
     1203                $key = md5( $old_theme ); 
     1204                // Store widgets for 1 week so we can restore if needed 
     1205                set_transient( 'old_widgets_' . $key, $sidebars_widgets, 604800 ); 
     1206 
     1207                retrieve_widgets(); 
     1208                update_option( 'theme_switched', false ); 
     1209        } 
     1210} 
     1211// look for "lost" widgets, this has to run at least on each theme change 
     1212function retrieve_widgets() { 
     1213        global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; 
     1214 
     1215        $key = md5( get_current_theme() ); 
     1216        if ( false !== ( $_sidebars_widgets = get_transient( "old_widgets_{$key}" ) ) ) { 
     1217                delete_transient( "old_widgets_{$key}" ); 
     1218        } else { 
     1219                if ( ! is_array( $sidebars_widgets ) ) 
     1220                        $sidebars_widgets = wp_get_sidebars_widgets(); 
     1221 
     1222                $sidebars = array_keys($wp_registered_sidebars); 
     1223 
     1224                unset( $sidebars_widgets['array_version'] ); 
     1225 
     1226                $old = array_keys($sidebars_widgets); 
     1227                sort($old); 
     1228                sort($sidebars); 
     1229 
     1230                if ( $old == $sidebars ) 
     1231                        return; 
     1232 
     1233 
     1234                $_sidebars_widgets = array( 
     1235                        'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets'] 
     1236                ); 
     1237                unset( $sidebars_widgets['wp_inactive_widgets'] ); 
     1238                foreach ( $wp_registered_sidebars as $id => $settings ) { 
     1239                        if ( ! empty( $sidebars_widgets ) ) 
     1240                                $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); 
     1241                } 
     1242                if ( !empty($sidebars_widgets) ) { 
     1243                        $orphaned = 0; 
     1244                        foreach ( $sidebars_widgets as $val ) { 
     1245                                if ( is_array($val) && ! empty( $val ) ) 
     1246                                        $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val; 
     1247                        } 
     1248                } 
     1249        } 
     1250 
     1251        // discard invalid, theme-specific widgets from sidebars 
     1252        $shown_widgets = array(); 
     1253        foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 
     1254                if ( !is_array($widgets) ) 
     1255                        continue; 
     1256 
     1257                $_widgets = array(); 
     1258                foreach ( $widgets as $widget ) { 
     1259                        if ( isset($wp_registered_widgets[$widget]) ) 
     1260                                $_widgets[] = $widget; 
     1261                } 
     1262                $_sidebars_widgets[$sidebar] = $_widgets; 
     1263                $shown_widgets = array_merge($shown_widgets, $_widgets); 
     1264        } 
     1265 
     1266        $sidebars_widgets = $_sidebars_widgets; 
     1267        unset($_sidebars_widgets, $_widgets); 
     1268 
     1269        // find hidden/lost multi-widget instances 
     1270        $lost_widgets = array(); 
     1271        foreach ( $wp_registered_widgets as $key => $val ) { 
     1272                if ( in_array($key, $shown_widgets, true) ) 
     1273                        continue; 
     1274 
     1275                $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); 
     1276 
     1277                if ( 2 > (int) $number ) 
     1278                        continue; 
     1279 
     1280                $lost_widgets[] = $key; 
     1281        } 
     1282 
     1283        $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 
     1284        wp_set_sidebars_widgets($sidebars_widgets); 
     1285        return $sidebars_widgets; 
     1286}