Ticket #17979: 17979.9.diff
| File 17979.9.diff, 9.9 KB (added by aaroncampbell, 22 months ago) |
|---|
-
wp-includes/default-filters.php
218 218 add_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 ); 219 219 add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 ); 220 220 add_action( 'wp_print_footer_scripts', '_wp_footer_scripts' ); 221 add_action( 'init', 'check_theme_switched', 99 ); 221 222 222 223 if ( isset( $_GET['replytocom'] ) ) 223 224 add_filter( 'pre_option_blog_public', '__return_zero' ); -
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
547 547 'name' => sprintf(__('Sidebar %d'), $i ), 548 548 'id' => "sidebar-$i", 549 549 'description' => '', 550 'class' => '', 550 551 'before_widget' => '<li id="%1$s" class="widget %2$s">', 551 552 'after_widget' => "</li>\n", 552 553 'before_title' => '<h2 class="widgettitle">', … … 1055 1056 unset($_sidebars_widgets); 1056 1057 1057 1058 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(); 1082 1060 } 1083 1061 } 1084 1062 … … 1215 1193 function _get_widget_id_base($id) { 1216 1194 return preg_replace( '/-[0-9]+$/', '', $id ); 1217 1195 } 1196 1197 function 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 // look for "lost" widgets, this has to run at least on each theme change 1213 function retrieve_widgets() { 1214 global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; 1215 1216 $key = md5( get_current_theme() ); 1217 if ( false !== ( $_sidebars_widgets = get_transient( "old_widgets_{$key}" ) ) ) { 1218 delete_transient( "old_widgets_{$key}" ); 1219 } else { 1220 if ( ! is_array( $sidebars_widgets ) ) 1221 $sidebars_widgets = wp_get_sidebars_widgets(); 1222 1223 $sidebars = array_keys($wp_registered_sidebars); 1224 1225 unset( $sidebars_widgets['array_version'] ); 1226 1227 $old = array_keys($sidebars_widgets); 1228 sort($old); 1229 sort($sidebars); 1230 1231 if ( $old == $sidebars ) 1232 return; 1233 1234 1235 $_sidebars_widgets = array( 1236 'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets'] 1237 ); 1238 unset( $sidebars_widgets['wp_inactive_widgets'] ); 1239 foreach ( $wp_registered_sidebars as $id => $settings ) { 1240 if ( ! empty( $sidebars_widgets ) ) 1241 $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); 1242 } 1243 if ( !empty($sidebars_widgets) ) { 1244 $orphaned = 0; 1245 foreach ( $sidebars_widgets as $val ) { 1246 if ( is_array($val) && ! empty( $val ) ) 1247 $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val; 1248 } 1249 } 1250 } 1251 1252 // discard invalid, theme-specific widgets from sidebars 1253 $shown_widgets = array(); 1254 foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 1255 if ( !is_array($widgets) ) 1256 continue; 1257 1258 $_widgets = array(); 1259 foreach ( $widgets as $widget ) { 1260 if ( isset($wp_registered_widgets[$widget]) ) 1261 $_widgets[] = $widget; 1262 } 1263 $_sidebars_widgets[$sidebar] = $_widgets; 1264 $shown_widgets = array_merge($shown_widgets, $_widgets); 1265 } 1266 1267 $sidebars_widgets = $_sidebars_widgets; 1268 unset($_sidebars_widgets, $_widgets); 1269 1270 // find hidden/lost multi-widget instances 1271 $lost_widgets = array(); 1272 foreach ( $wp_registered_widgets as $key => $val ) { 1273 if ( in_array($key, $shown_widgets, true) ) 1274 continue; 1275 1276 $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); 1277 1278 if ( 2 > (int) $number ) 1279 continue; 1280 1281 $lost_widgets[] = $key; 1282 } 1283 1284 $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 1285 wp_set_sidebars_widgets($sidebars_widgets); 1286 return $sidebars_widgets; 1287 } -
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'), 50 56 'id' => 'wp_inactive_widgets', 57 'class' => 'inactive', 51 58 'description' => '', 52 59 'before_widget' => '', 53 60 'after_widget' => '', … … 55 62 'after_title' => '', 56 63 )); 57 64 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 } 65 foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { 66 if ( empty( $wp_registered_sidebars[ $sidebar_id ] ) && ! empty( $widgets ) ) { 67 // register the inactive_widgets area as sidebar 68 register_sidebar(array( 69 'name' => __( 'Inactive Widgets (Previous Theme)' ), 70 'id' => $sidebar_id, 71 'class' => 'orphaned', 72 'description' => __( 'This is a left over sidebar from an old theme and does not show anywhere on your site' ), 73 'before_widget' => '', 74 'after_widget' => '', 75 'before_title' => '', 76 'after_title' => '', 77 )); 85 78 } 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 79 } 80 130 81 retrieve_widgets(); 131 82 132 83 if ( count($wp_registered_sidebars) == 1 ) { … … 387 338 foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) { 388 339 if ( 'wp_inactive_widgets' == $sidebar ) 389 340 continue; 390 $closed = $i ? ' closed' : ''; ?> 391 <div class="widgets-holder-wrap<?php echo $closed; ?>"> 341 $wrap_class = 'widgets-holder-wrap'; 342 if ( !empty( $registered_sidebar['class'] ) ) 343 $wrap_class .= ' sidebar-' . $registered_sidebar['class']; 344 if ( $i ) 345 $wrap_class .= ' closed'; ?> 346 <div class="<?php esc_attr_e( $wrap_class ); ?>"> 392 347 <div class="sidebar-name"> 393 348 <div class="sidebar-name-arrow"><br /></div> 394 349 <h3><?php echo esc_html( $registered_sidebar['name'] ); ?>