Ticket #17979: 17979.3.diff
| File 17979.3.diff, 7.0 KB (added by aaroncampbell, 21 months ago) |
|---|
-
wp-admin/widgets.php
62 62 if ( empty( $sidebars_widgets ) ) 63 63 $sidebars_widgets = wp_get_widget_defaults(); 64 64 65 // look for "lost" widgets, this has to run at least on each theme change66 function retrieve_widgets() {67 global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;68 69 $_sidebars_widgets = array();70 $sidebars = array_keys($wp_registered_sidebars);71 72 unset( $sidebars_widgets['array_version'] );73 74 $old = array_keys($sidebars_widgets);75 sort($old);76 sort($sidebars);77 78 if ( $old == $sidebars )79 return;80 81 // Move the known-good ones first82 foreach ( $sidebars as $id ) {83 if ( array_key_exists( $id, $sidebars_widgets ) ) {84 $_sidebars_widgets[$id] = $sidebars_widgets[$id];85 unset($sidebars_widgets[$id], $sidebars[$id]);86 }87 }88 89 // if new theme has less sidebars than the old theme90 if ( !empty($sidebars_widgets) ) {91 foreach ( $sidebars_widgets as $lost => $val ) {92 if ( is_array($val) )93 $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val );94 }95 }96 97 // discard invalid, theme-specific widgets from sidebars98 $shown_widgets = array();99 foreach ( $_sidebars_widgets as $sidebar => $widgets ) {100 if ( !is_array($widgets) )101 continue;102 103 $_widgets = array();104 foreach ( $widgets as $widget ) {105 if ( isset($wp_registered_widgets[$widget]) )106 $_widgets[] = $widget;107 }108 $_sidebars_widgets[$sidebar] = $_widgets;109 $shown_widgets = array_merge($shown_widgets, $_widgets);110 }111 112 $sidebars_widgets = $_sidebars_widgets;113 unset($_sidebars_widgets, $_widgets);114 115 // find hidden/lost multi-widget instances116 $lost_widgets = array();117 foreach ( $wp_registered_widgets as $key => $val ) {118 if ( in_array($key, $shown_widgets, true) )119 continue;120 121 $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key);122 123 if ( 2 > (int) $number )124 continue;125 126 $lost_widgets[] = $key;127 }128 129 $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']);130 wp_set_sidebars_widgets($sidebars_widgets);131 }132 65 retrieve_widgets(); 133 66 134 67 if ( count($wp_registered_sidebars) == 1 ) { -
wp-includes/default-filters.php
215 215 add_action( 'wp_footer', 'wp_print_footer_scripts' ); 216 216 add_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 ); 217 217 add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 ); 218 add_action( 'init', 'check_theme_switched', 99 ); 218 219 219 220 if ( isset( $_GET['replytocom'] ) ) 220 221 add_filter( 'pre_option_blog_public', '__return_zero' ); -
wp-includes/theme.php
1260 1260 $default_theme_mods = (array) get_option( "mods_$theme" ); 1261 1261 add_option( "theme_mods_$stylesheet", $default_theme_mods ); 1262 1262 } 1263 do_action('switch_theme', $theme); 1263 update_option( 'theme_switched', 'true' ); 1264 do_action( 'switch_theme', $theme ); 1264 1265 } 1265 1266 1266 1267 /** -
wp-includes/widgets.php
1055 1055 unset($_sidebars_widgets); 1056 1056 1057 1057 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 } 1058 $sidebars_widgets = retrieve_widgets(); 1082 1059 } 1083 1060 } 1084 1061 … … 1215 1192 function _get_widget_id_base($id) { 1216 1193 return preg_replace( '/-[0-9]+$/', '', $id ); 1217 1194 } 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( $sidebars_widgets ) ) 1227 $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); 1228 } 1229 if ( !empty($sidebars_widgets) ) { 1230 foreach ( $sidebars_widgets as $lost => $val ) { 1231 if ( is_array($val) ) 1232 $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $val ); 1233 } 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 }
