| 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(); |
| | 1195 | |
| | 1196 | function check_theme_switched() { |
| | 1197 | if ( get_option( 'theme_switched' ) ) { |
| | 1198 | retrieve_widgets(); |
| | 1199 | update_option( 'theme_switched', false ); |
| | 1200 | } |
| | 1201 | } |
| | 1202 | // look for "lost" widgets, this has to run at least on each theme change |
| | 1203 | function retrieve_widgets() { |
| | 1204 | global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; |
| | 1205 | |
| | 1206 | if ( ! is_array( $sidebars_widgets ) ) |
| | 1207 | $sidebars_widgets = wp_get_sidebars_widgets(); |
| | 1208 | |
| | 1209 | $sidebars = array_keys($wp_registered_sidebars); |
| | 1210 | |
| | 1211 | unset( $sidebars_widgets['array_version'] ); |
| | 1212 | |
| | 1213 | $old = array_keys($sidebars_widgets); |
| | 1214 | sort($old); |
| | 1215 | sort($sidebars); |
| | 1216 | |
| | 1217 | if ( $old == $sidebars ) |
| | 1218 | return; |
| | 1219 | |
| | 1220 | |
| | 1221 | $_sidebars_widgets = array( |
| | 1222 | 'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets'] |
| | 1223 | ); |
| | 1224 | unset( $sidebars_widgets['wp_inactive_widgets'] ); |
| | 1225 | foreach ( $wp_registered_sidebars as $id => $settings ) { |
| | 1226 | if ( empty( $first_id ) ) |
| | 1227 | $first_id = $id; |
| | 1228 | if ( ! empty( $sidebars_widgets ) ) |
| | 1229 | $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); |
| | 1230 | } |
| | 1231 | if ( ! empty( $sidebars_widgets ) ){ |
| | 1232 | foreach( $sidebars_widgets as $leftover_sidebar ) |
| | 1233 | $_sidebars_widgets[$first_id] = array_merge( (array) $_sidebars_widgets[$first_id], $leftover_sidebar ); |
| | 1234 | } |
| | 1235 | |
| | 1236 | // discard invalid, theme-specific widgets from sidebars |
| | 1237 | $shown_widgets = array(); |
| | 1238 | foreach ( $_sidebars_widgets as $sidebar => $widgets ) { |
| | 1239 | if ( !is_array($widgets) ) |
| | 1240 | continue; |
| | 1241 | |
| | 1242 | $_widgets = array(); |
| | 1243 | foreach ( $widgets as $widget ) { |
| | 1244 | if ( isset($wp_registered_widgets[$widget]) ) |
| | 1245 | $_widgets[] = $widget; |
| | 1246 | } |
| | 1247 | $_sidebars_widgets[$sidebar] = $_widgets; |
| | 1248 | $shown_widgets = array_merge($shown_widgets, $_widgets); |
| | 1249 | } |
| | 1250 | |
| | 1251 | $sidebars_widgets = $_sidebars_widgets; |
| | 1252 | unset($_sidebars_widgets, $_widgets); |
| | 1253 | |
| | 1254 | // find hidden/lost multi-widget instances |
| | 1255 | $lost_widgets = array(); |
| | 1256 | foreach ( $wp_registered_widgets as $key => $val ) { |
| | 1257 | if ( in_array($key, $shown_widgets, true) ) |
| | 1258 | continue; |
| | 1259 | |
| | 1260 | $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); |
| | 1261 | |
| | 1262 | if ( 2 > (int) $number ) |
| | 1263 | continue; |
| | 1264 | |
| | 1265 | $lost_widgets[] = $key; |
| | 1266 | } |
| | 1267 | |
| | 1268 | $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); |
| | 1269 | wp_set_sidebars_widgets($sidebars_widgets); |
| | 1270 | return $sidebars_widgets; |
| | 1271 | } |