Ticket #17979: 17979.4.diff
File 17979.4.diff, 7.9 KB (added by , 13 years ago) |
---|
-
wp-admin/widgets.php
46 46 $help .= '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'; 47 47 add_contextual_help($current_screen, $help); 48 48 49 // These are the widgets grouped by sidebar 50 $sidebars_widgets = wp_get_sidebars_widgets(); 51 52 if ( empty( $sidebars_widgets ) ) 53 $sidebars_widgets = wp_get_widget_defaults(); 54 49 55 // register the inactive_widgets area as sidebar 50 56 register_sidebar(array( 51 57 'name' => __('Inactive Widgets'), … … 57 63 'after_title' => '', 58 64 )); 59 65 60 // These are the widgets grouped by sidebar 61 $sidebars_widgets = wp_get_sidebars_widgets(); 62 if ( empty( $sidebars_widgets ) ) 63 $sidebars_widgets = wp_get_widget_defaults(); 64 65 // look for "lost" widgets, this has to run at least on each theme change 66 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 first 82 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 } 66 foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { 67 if ( empty( $wp_registered_sidebars[ $sidebar_id ] ) ) { 68 // register the inactive_widgets area as sidebar 69 register_sidebar(array( 70 'name' => __('Orphaned Widgets'), 71 'id' => $sidebar_id, 72 'description' => '', 73 'before_widget' => '', 74 'after_widget' => '', 75 'before_title' => '', 76 'after_title' => '', 77 )); 87 78 } 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 79 } 80 132 81 retrieve_widgets(); 133 82 134 83 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 $poor_lost_puppy => $val ) { 1231 if ( is_array($val) ) { 1232 $_sidebars_widgets[$poor_lost_puppy] = $val; 1233 } 1234 } 1235 } 1236 1237 // discard invalid, theme-specific widgets from sidebars 1238 $shown_widgets = array(); 1239 foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 1240 if ( !is_array($widgets) ) 1241 continue; 1242 1243 $_widgets = array(); 1244 foreach ( $widgets as $widget ) { 1245 if ( isset($wp_registered_widgets[$widget]) ) 1246 $_widgets[] = $widget; 1247 } 1248 $_sidebars_widgets[$sidebar] = $_widgets; 1249 $shown_widgets = array_merge($shown_widgets, $_widgets); 1250 } 1251 1252 $sidebars_widgets = $_sidebars_widgets; 1253 unset($_sidebars_widgets, $_widgets); 1254 1255 // find hidden/lost multi-widget instances 1256 $lost_widgets = array(); 1257 foreach ( $wp_registered_widgets as $key => $val ) { 1258 if ( in_array($key, $shown_widgets, true) ) 1259 continue; 1260 1261 $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); 1262 1263 if ( 2 > (int) $number ) 1264 continue; 1265 1266 $lost_widgets[] = $key; 1267 } 1268 1269 $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 1270 wp_set_sidebars_widgets($sidebars_widgets); 1271 return $sidebars_widgets; 1272 }