Ticket #17979: 17979.5.diff
File 17979.5.diff, 8.8 KB (added by , 13 years ago) |
---|
-
wp-admin/widgets.php
44 44 $help .= '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'; 45 45 add_contextual_help($current_screen, $help); 46 46 47 // These are the widgets grouped by sidebar 48 $sidebars_widgets = wp_get_sidebars_widgets(); 49 50 if ( empty( $sidebars_widgets ) ) 51 $sidebars_widgets = wp_get_widget_defaults(); 52 47 53 // register the inactive_widgets area as sidebar 48 54 register_sidebar(array( 49 55 'name' => __('Inactive Widgets'), … … 55 61 'after_title' => '', 56 62 )); 57 63 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 } 64 foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { 65 if ( empty( $wp_registered_sidebars[ $sidebar_id ] ) ) { 66 // register the inactive_widgets area as sidebar 67 register_sidebar(array( 68 'name' => __('Orphaned Widgets'), 69 'id' => $sidebar_id, 70 'description' => '', 71 'before_widget' => '', 72 'after_widget' => '', 73 'before_title' => '', 74 'after_title' => '', 75 )); 85 76 } 86 87 // if new theme has less sidebars than the old theme88 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 sidebars96 $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 instances114 $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 77 } 78 130 79 retrieve_widgets(); 131 80 132 81 if ( count($wp_registered_sidebars) == 1 ) { -
wp-includes/default-filters.php
217 217 add_action( 'wp_footer', 'wp_print_footer_scripts' ); 218 218 add_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 ); 219 219 add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 ); 220 add_action( 'init', 'check_theme_switched', 99 ); 220 221 221 222 if ( isset( $_GET['replytocom'] ) ) 222 223 add_filter( 'pre_option_blog_public', '__return_zero' ); … … 284 285 285 286 unset($filter, $action); 286 287 287 ?> 288 No newline at end of file 288 ?> -
wp-includes/theme.php
1248 1248 function switch_theme($template, $stylesheet) { 1249 1249 global $wp_theme_directories; 1250 1250 1251 $old_theme = get_current_theme(); 1252 1251 1253 update_option('template', $template); 1252 1254 update_option('stylesheet', $stylesheet); 1253 1255 if ( count($wp_theme_directories) > 1 ) { … … 1260 1262 $default_theme_mods = (array) get_option( "mods_$theme" ); 1261 1263 add_option( "theme_mods_$stylesheet", $default_theme_mods ); 1262 1264 } 1263 do_action('switch_theme', $theme); 1265 update_option( 'theme_switched', $old_theme ); 1266 do_action( 'switch_theme', $theme ); 1264 1267 } 1265 1268 1266 1269 /** -
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 ( false !== ( $old_theme = get_option( 'theme_switched' ) ) && !empty( $old_theme ) ) { 1198 global $sidebars_widgets; 1199 1200 if ( ! is_array( $sidebars_widgets ) ) 1201 $sidebars_widgets = wp_get_sidebars_widgets(); 1202 1203 $key = md5( $old_theme ); 1204 // Store widgets for 1 week so we can restore if needed 1205 set_transient( 'old_widgets_' . $key, $sidebars_widgets, 604800 ); 1206 1207 retrieve_widgets(); 1208 update_option( 'theme_switched', false ); 1209 } 1210 } 1211 // look for "lost" widgets, this has to run at least on each theme change 1212 function retrieve_widgets() { 1213 global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; 1214 1215 $key = md5( get_current_theme() ); 1216 if ( false !== ( $_sidebars_widgets = get_transient( "old_widgets_{$key}" ) ) ) { 1217 delete_transient( "old_widgets_{$key}" ); 1218 } else { 1219 if ( ! is_array( $sidebars_widgets ) ) 1220 $sidebars_widgets = wp_get_sidebars_widgets(); 1221 1222 $sidebars = array_keys($wp_registered_sidebars); 1223 1224 unset( $sidebars_widgets['array_version'] ); 1225 1226 $old = array_keys($sidebars_widgets); 1227 sort($old); 1228 sort($sidebars); 1229 1230 if ( $old == $sidebars ) 1231 return; 1232 1233 1234 $_sidebars_widgets = array( 1235 'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets'] 1236 ); 1237 unset( $sidebars_widgets['wp_inactive_widgets'] ); 1238 foreach ( $wp_registered_sidebars as $id => $settings ) { 1239 if ( ! empty( $sidebars_widgets ) ) 1240 $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); 1241 } 1242 if ( !empty($sidebars_widgets) ) { 1243 foreach ( $sidebars_widgets as $poor_lost_puppy => $val ) { 1244 if ( is_array($val) ) { 1245 $_sidebars_widgets[$poor_lost_puppy] = $val; 1246 } 1247 } 1248 } 1249 } 1250 1251 // discard invalid, theme-specific widgets from sidebars 1252 $shown_widgets = array(); 1253 foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 1254 if ( !is_array($widgets) ) 1255 continue; 1256 1257 $_widgets = array(); 1258 foreach ( $widgets as $widget ) { 1259 if ( isset($wp_registered_widgets[$widget]) ) 1260 $_widgets[] = $widget; 1261 } 1262 $_sidebars_widgets[$sidebar] = $_widgets; 1263 $shown_widgets = array_merge($shown_widgets, $_widgets); 1264 } 1265 1266 $sidebars_widgets = $_sidebars_widgets; 1267 unset($_sidebars_widgets, $_widgets); 1268 1269 // find hidden/lost multi-widget instances 1270 $lost_widgets = array(); 1271 foreach ( $wp_registered_widgets as $key => $val ) { 1272 if ( in_array($key, $shown_widgets, true) ) 1273 continue; 1274 1275 $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); 1276 1277 if ( 2 > (int) $number ) 1278 continue; 1279 1280 $lost_widgets[] = $key; 1281 } 1282 1283 $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 1284 wp_set_sidebars_widgets($sidebars_widgets); 1285 return $sidebars_widgets; 1286 }