WordPress.org

Make WordPress Core

Ticket #17979: 17979.9.diff

File 17979.9.diff, 9.9 KB (added by aaroncampbell, 7 years ago)
  • wp-includes/default-filters.php

     
    218218add_action( 'wp_head',             'wp_shortlink_wp_head',            10, 0 );
    219219add_action( 'template_redirect',   'wp_shortlink_header',             11, 0 );
    220220add_action( 'wp_print_footer_scripts', '_wp_footer_scripts'                 );
     221add_action( 'init',                'check_theme_switched',            99    );
    221222
    222223if ( isset( $_GET['replytocom'] ) )
    223224    add_filter( 'pre_option_blog_public', '__return_zero' );
  • 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

     
    547547                'name' => sprintf(__('Sidebar %d'), $i ),
    548548                'id' => "sidebar-$i",
    549549                'description' => '',
     550                'class' => '',
    550551                'before_widget' => '<li id="%1$s" class="widget %2$s">',
    551552                'after_widget' => "</li>\n",
    552553                'before_title' => '<h2 class="widgettitle">',
     
    10551056                                unset($_sidebars_widgets);
    10561057
    10571058                        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                                 }
     1059                                $sidebars_widgets = retrieve_widgets();
    10821060                }
    10831061        }
    10841062
     
    12151193function _get_widget_id_base($id) {
    12161194        return preg_replace( '/-[0-9]+$/', '', $id );
    12171195}
     1196
     1197function check_theme_switched() {
     1198        if ( false !== ( $old_theme = get_option( 'theme_switched' ) ) && !empty( $old_theme ) ) {
     1199                global $sidebars_widgets;
     1200
     1201                if ( ! is_array( $sidebars_widgets ) )
     1202                        $sidebars_widgets = wp_get_sidebars_widgets();
     1203
     1204                $key = md5( $old_theme );
     1205                // Store widgets for 1 week so we can restore if needed
     1206                set_transient( 'old_widgets_' . $key, $sidebars_widgets, 604800 );
     1207
     1208                retrieve_widgets();
     1209                update_option( 'theme_switched', false );
     1210        }
     1211}
     1212// look for "lost" widgets, this has to run at least on each theme change
     1213function retrieve_widgets() {
     1214        global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;
     1215
     1216        $key = md5( get_current_theme() );
     1217        if ( false !== ( $_sidebars_widgets = get_transient( "old_widgets_{$key}" ) ) ) {
     1218                delete_transient( "old_widgets_{$key}" );
     1219        } else {
     1220                if ( ! is_array( $sidebars_widgets ) )
     1221                        $sidebars_widgets = wp_get_sidebars_widgets();
     1222
     1223                $sidebars = array_keys($wp_registered_sidebars);
     1224
     1225                unset( $sidebars_widgets['array_version'] );
     1226
     1227                $old = array_keys($sidebars_widgets);
     1228                sort($old);
     1229                sort($sidebars);
     1230
     1231                if ( $old == $sidebars )
     1232                        return;
     1233
     1234
     1235                $_sidebars_widgets = array(
     1236                        'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets']
     1237                );
     1238                unset( $sidebars_widgets['wp_inactive_widgets'] );
     1239                foreach ( $wp_registered_sidebars as $id => $settings ) {
     1240                        if ( ! empty( $sidebars_widgets ) )
     1241                                $_sidebars_widgets[$id] = array_shift( $sidebars_widgets );
     1242                }
     1243                if ( !empty($sidebars_widgets) ) {
     1244                        $orphaned = 0;
     1245                        foreach ( $sidebars_widgets as $val ) {
     1246                                if ( is_array($val) && ! empty( $val ) )
     1247                                        $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val;
     1248                        }
     1249                }
     1250        }
     1251
     1252        // discard invalid, theme-specific widgets from sidebars
     1253        $shown_widgets = array();
     1254        foreach ( $_sidebars_widgets as $sidebar => $widgets ) {
     1255                if ( !is_array($widgets) )
     1256                        continue;
     1257
     1258                $_widgets = array();
     1259                foreach ( $widgets as $widget ) {
     1260                        if ( isset($wp_registered_widgets[$widget]) )
     1261                                $_widgets[] = $widget;
     1262                }
     1263                $_sidebars_widgets[$sidebar] = $_widgets;
     1264                $shown_widgets = array_merge($shown_widgets, $_widgets);
     1265        }
     1266
     1267        $sidebars_widgets = $_sidebars_widgets;
     1268        unset($_sidebars_widgets, $_widgets);
     1269
     1270        // find hidden/lost multi-widget instances
     1271        $lost_widgets = array();
     1272        foreach ( $wp_registered_widgets as $key => $val ) {
     1273                if ( in_array($key, $shown_widgets, true) )
     1274                        continue;
     1275
     1276                $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key);
     1277
     1278                if ( 2 > (int) $number )
     1279                        continue;
     1280
     1281                $lost_widgets[] = $key;
     1282        }
     1283
     1284        $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']);
     1285        wp_set_sidebars_widgets($sidebars_widgets);
     1286        return $sidebars_widgets;
     1287}
  • 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'),
    5056        'id' => 'wp_inactive_widgets',
     57        'class' => 'inactive',
    5158        'description' => '',
    5259        'before_widget' => '',
    5360        'after_widget' => '',
     
    5562        'after_title' => '',
    5663));
    5764
    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                 }
     65foreach ( $sidebars_widgets as $sidebar_id => $widgets ) {
     66        if ( empty( $wp_registered_sidebars[ $sidebar_id ] ) && ! empty( $widgets ) ) {
     67                // register the inactive_widgets area as sidebar
     68                register_sidebar(array(
     69                        'name' => __( 'Inactive Widgets (Previous Theme)' ),
     70                        'id' => $sidebar_id,
     71                        'class' => 'orphaned',
     72                        'description' => __( 'This is a left over sidebar from an old theme and does not show anywhere on your site' ),
     73                        'before_widget' => '',
     74                        'after_widget' => '',
     75                        'before_title' => '',
     76                        'after_title' => '',
     77                ));
    8578        }
    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);
    12979}
     80
    13081retrieve_widgets();
    13182
    13283if ( count($wp_registered_sidebars) == 1 ) {
     
    387338foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
    388339        if ( 'wp_inactive_widgets' == $sidebar )
    389340                continue;
    390         $closed = $i ? ' closed' : ''; ?>
    391         <div class="widgets-holder-wrap<?php echo $closed; ?>">
     341        $wrap_class = 'widgets-holder-wrap';
     342        if ( !empty( $registered_sidebar['class'] ) )
     343                $wrap_class .= ' sidebar-' . $registered_sidebar['class'];
     344        if ( $i )
     345                $wrap_class .= ' closed'; ?>
     346        <div class="<?php esc_attr_e( $wrap_class ); ?>">
    392347        <div class="sidebar-name">
    393348        <div class="sidebar-name-arrow"><br /></div>
    394349        <h3><?php echo esc_html( $registered_sidebar['name'] ); ?>