Make WordPress Core


Ignore:
Timestamp:
09/02/2011 10:13:55 PM (12 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-includes/widgets.php

    r18532 r18630  
    548548        'id' => "sidebar-$i",
    549549        'description' => '',
     550        'class' => '',
    550551        'before_widget' => '<li id="%1$s" class="widget %2$s">',
    551552        'after_widget' => "</li>\n",
     
    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    }
     
    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
     1213// look for "lost" widgets, this has to run at least on each theme change
     1214function retrieve_widgets() {
     1215    global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;
     1216
     1217    $key = md5( get_current_theme() );
     1218    if ( false !== ( $_sidebars_widgets = get_transient( "old_widgets_{$key}" ) ) ) {
     1219        delete_transient( "old_widgets_{$key}" );
     1220    } else {
     1221        if ( ! is_array( $sidebars_widgets ) )
     1222            $sidebars_widgets = wp_get_sidebars_widgets();
     1223
     1224        $sidebars = array_keys($wp_registered_sidebars);
     1225
     1226        unset( $sidebars_widgets['array_version'] );
     1227
     1228        $old = array_keys($sidebars_widgets);
     1229        sort($old);
     1230        sort($sidebars);
     1231
     1232        if ( $old == $sidebars )
     1233            return;
     1234
     1235        $_sidebars_widgets = array(
     1236            'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets']
     1237        );
     1238
     1239        unset( $sidebars_widgets['wp_inactive_widgets'] );
     1240
     1241        foreach ( $wp_registered_sidebars as $id => $settings ) {
     1242            if ( ! empty( $sidebars_widgets ) )
     1243                $_sidebars_widgets[$id] = array_shift( $sidebars_widgets );
     1244        }
     1245
     1246        if ( !empty($sidebars_widgets) ) {
     1247            $orphaned = 0;
     1248
     1249            foreach ( $sidebars_widgets as $val ) {
     1250                if ( is_array($val) && ! empty( $val ) )
     1251                    $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val;
     1252            }
     1253        }
     1254    }
     1255
     1256    // discard invalid, theme-specific widgets from sidebars
     1257    $shown_widgets = array();
     1258
     1259    foreach ( $_sidebars_widgets as $sidebar => $widgets ) {
     1260        if ( !is_array($widgets) )
     1261            continue;
     1262
     1263        $_widgets = array();
     1264        foreach ( $widgets as $widget ) {
     1265            if ( isset($wp_registered_widgets[$widget]) )
     1266                $_widgets[] = $widget;
     1267        }
     1268
     1269        $_sidebars_widgets[$sidebar] = $_widgets;
     1270        $shown_widgets = array_merge($shown_widgets, $_widgets);
     1271    }
     1272
     1273    $sidebars_widgets = $_sidebars_widgets;
     1274    unset($_sidebars_widgets, $_widgets);
     1275
     1276    // find hidden/lost multi-widget instances
     1277    $lost_widgets = array();
     1278    foreach ( $wp_registered_widgets as $key => $val ) {
     1279        if ( in_array($key, $shown_widgets, true) )
     1280            continue;
     1281
     1282        $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key);
     1283
     1284        if ( 2 > (int) $number )
     1285            continue;
     1286
     1287        $lost_widgets[] = $key;
     1288    }
     1289
     1290    $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']);
     1291    wp_set_sidebars_widgets($sidebars_widgets);
     1292
     1293    return $sidebars_widgets;
     1294}
Note: See TracChangeset for help on using the changeset viewer.