From b627c996865b0335e98a3a76ef26cfeaa9677833 Mon Sep 17 00:00:00 2001 From: Andrew Ozz Date: Sat, 26 Nov 2011 06:16:43 +0000 Subject: [PATCH] Check the sidebar class for orphaned sidebars, match sidebars by id while retrieving orphans and the theme has not changed, props SergeyBiryukov, fixes #19350 git-svn-id: https://develop.svn.wordpress.org/trunk@19455 602fd350-edb4-49c9-b593-d223f7449a82 --- wp-admin/widgets.php | 6 +++--- wp-includes/widgets.php | 22 ++++++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/wp-admin/widgets.php b/wp-admin/widgets.php index 39c04cd8c5..92cbcb13d5 100644 --- a/wp-admin/widgets.php +++ b/wp-admin/widgets.php @@ -96,7 +96,7 @@ foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { if ( ! empty( $widgets ) ) { // register the inactive_widgets area as sidebar register_sidebar(array( 'name' => __( 'Inactive Sidebar (not used)' ), - 'id' => 'orphaned_widgets-' . $sidebar_id, + 'id' => $sidebar_id, 'class' => 'inactive-sidebar orphan-sidebar', 'description' => __( 'This sidebar is no longer available and does not show anywhere on your site. Remove each of the widgets below to fully remove this inactive sidebar.' ), 'before_widget' => '', @@ -344,7 +344,7 @@ require_once( './admin-header.php' ); ?> $registered_sidebar ) { - if ( 'wp_inactive_widgets' == $sidebar || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) { + if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) { $wrap_class = 'widgets-holder-wrap'; if ( !empty( $registered_sidebar['class'] ) ) $wrap_class .= ' ' . $registered_sidebar['class']; @@ -376,7 +376,7 @@ foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) { $registered_sidebar ) { - if ( 'wp_inactive_widgets' == $sidebar || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) + if ( false !== strpos( $registered_sidebar['class'], 'inactive-sidebar' ) || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) continue; $wrap_class = 'widgets-holder-wrap'; diff --git a/wp-includes/widgets.php b/wp-includes/widgets.php index ffbea5f2b0..2dfafcb5da 100644 --- a/wp-includes/widgets.php +++ b/wp-includes/widgets.php @@ -1157,22 +1157,21 @@ function _wp_sidebars_changed() { if ( ! is_array( $sidebars_widgets ) ) $sidebars_widgets = wp_get_sidebars_widgets(); - retrieve_widgets(); + retrieve_widgets(true); } // look for "lost" widgets, this has to run at least on each theme change -function retrieve_widgets() { +function retrieve_widgets($theme_changed = false) { global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; $registered_sidebar_keys = array_keys( $wp_registered_sidebars ); + $orphaned = 0; $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' ); if ( is_array( $old_sidebars_widgets ) ) { // time() that sidebars were stored is in $old_sidebars_widgets['time'] $_sidebars_widgets = $old_sidebars_widgets['data']; remove_theme_mod( 'sidebars_widgets' ); - - $orphaned = 0; foreach ( $_sidebars_widgets as $sidebar => $widgets ) { if ( 'wp_inactive_widgets' == $sidebar || 'orphaned_widgets' == substr( $sidebar, 0, 16 ) ) @@ -1202,10 +1201,17 @@ function retrieve_widgets() { unset( $sidebars_widgets['wp_inactive_widgets'] ); - foreach ( $wp_registered_sidebars as $id => $settings ) - $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); - - $orphaned = 0; + foreach ( $wp_registered_sidebars as $id => $settings ) { + if ( $theme_changed ) { + $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); + } else { + // no theme change, grab only sidebars that are currently registered + if ( isset( $sidebars_widgets[$id] ) ) { + $_sidebars_widgets[$id] = $sidebars_widgets[$id]; + unset( $sidebars_widgets[$id] ); + } + } + } foreach ( $sidebars_widgets as $val ) { if ( is_array($val) && ! empty( $val ) )