Make WordPress Core


Ignore:
Timestamp:
09/02/2011 10:13:55 PM (13 years ago)
Author:
azaozz
Message:

Avoid losing widgets when switching themes - take one, props aaroncampbell, see #17979

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/widgets.php

    r18577 r18630  
    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' => '',
     
    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         }
    85     }
    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);
    129 }
     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        ));
     78    }
     79}
     80
    13081retrieve_widgets();
    13182
     
    388339    if ( 'wp_inactive_widgets' == $sidebar )
    389340        continue;
    390     $closed = $i ? ' closed' : ''; ?>
    391     <div class="widgets-holder-wrap<?php echo $closed; ?>">
     341
     342    $wrap_class = 'widgets-holder-wrap';
     343    if ( !empty( $registered_sidebar['class'] ) )
     344        $wrap_class .= ' sidebar-' . $registered_sidebar['class'];
     345
     346    if ( $i )
     347        $wrap_class .= ' closed'; ?>
     348
     349    <div class="<?php esc_attr_e( $wrap_class ); ?>">
    392350    <div class="sidebar-name">
    393351    <div class="sidebar-name-arrow"><br /></div>
Note: See TracChangeset for help on using the changeset viewer.