-// look for "lost" widgets, this has to run at least on each theme change
-function retrieve_widgets() {
- global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;
-
- $_sidebars_widgets = array();
- $sidebars = array_keys($wp_registered_sidebars);
-
- unset( $sidebars_widgets['array_version'] );
-
- $old = array_keys($sidebars_widgets);
- sort($old);
- sort($sidebars);
-
- if ( $old == $sidebars )
- return;
-
- // Move the known-good ones first
- foreach ( $sidebars as $id ) {
- if ( array_key_exists( $id, $sidebars_widgets ) ) {
- $_sidebars_widgets[$id] = $sidebars_widgets[$id];
- unset($sidebars_widgets[$id], $sidebars[$id]);
- }
- }
-
- // if new theme has less sidebars than the old theme
- if ( !empty($sidebars_widgets) ) {
- foreach ( $sidebars_widgets as $lost => $val ) {
- if ( is_array($val) )
- $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val );
- }
- }
-
- // discard invalid, theme-specific widgets from sidebars
- $shown_widgets = array();
- foreach ( $_sidebars_widgets as $sidebar => $widgets ) {
- if ( !is_array($widgets) )
- continue;