WordPress.org

Make WordPress Core

Ticket #17979: 17979.diff

File 17979.diff, 6.9 KB (added by aaroncampbell, 7 years ago)
  • wp-includes/default-filters.php

     
    215215add_action( 'wp_footer',           'wp_print_footer_scripts'              );
    216216add_action( 'wp_head',             'wp_shortlink_wp_head',          10, 0 );
    217217add_action( 'template_redirect',   'wp_shortlink_header',           11, 0 );
     218add_action( 'switch_theme',        'retrieve_widgets'                     );
    218219
    219220if ( isset( $_GET['replytocom'] ) )
    220221    add_filter( 'pre_option_blog_public', '__return_zero' );
  • wp-includes/theme.php

     
    12461246 * @param string $stylesheet Stylesheet name.
    12471247 */
    12481248function switch_theme($template, $stylesheet) {
    1249         global $wp_theme_directories;
     1249        global $wp_theme_directories, $sidebars_widgets;
    12501250
    12511251        update_option('template', $template);
    12521252        update_option('stylesheet', $stylesheet);
     
    12601260                $default_theme_mods = (array) get_option( "mods_$theme" );
    12611261                add_option( "theme_mods_$stylesheet", $default_theme_mods );
    12621262        }
     1263        $sidebars_widgets = wp_get_sidebars_widgets();
    12631264        do_action('switch_theme', $theme);
    12641265}
    12651266
  • wp-includes/widgets.php

     
    10551055                                unset($_sidebars_widgets);
    10561056
    10571057                        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();
    10821059                }
    10831060        }
    10841061
     
    12151192function _get_widget_id_base($id) {
    12161193        return preg_replace( '/-[0-9]+$/', '', $id );
    12171194}
     1195
     1196// look for "lost" widgets, this has to run at least on each theme change
     1197function retrieve_widgets() {
     1198        global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets;
     1199
     1200        $sidebars = array_keys($wp_registered_sidebars);
     1201
     1202        unset( $sidebars_widgets['array_version'] );
     1203
     1204        $old = array_keys($sidebars_widgets);
     1205        sort($old);
     1206        sort($sidebars);
     1207
     1208        if ( $old == $sidebars )
     1209                return;
     1210
     1211
     1212        $_sidebars_widgets = array(
     1213                'wp_inactive_widgets' => $sidebars_widgets['wp_inactive_widgets']
     1214        );
     1215        unset( $sidebars_widgets['wp_inactive_widgets'] );
     1216        foreach ( $wp_registered_sidebars as $id => $settings ) {
     1217                if ( ! empty( $sidebars_widgets ) )
     1218                        $_sidebars_widgets[$id] = array_shift( $sidebars_widgets );
     1219        }
     1220        if ( ! empty( $sidebars_widgets ) )
     1221                $_sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $_sidebars_widgets['wp_inactive_widgets'], $sidebars_widgets );
     1222
     1223        // discard invalid, theme-specific widgets from sidebars
     1224        $shown_widgets = array();
     1225        foreach ( $_sidebars_widgets as $sidebar => $widgets ) {
     1226                if ( !is_array($widgets) )
     1227                        continue;
     1228
     1229                $_widgets = array();
     1230                foreach ( $widgets as $widget ) {
     1231                        if ( isset($wp_registered_widgets[$widget]) )
     1232                                $_widgets[] = $widget;
     1233                }
     1234                $_sidebars_widgets[$sidebar] = $_widgets;
     1235                $shown_widgets = array_merge($shown_widgets, $_widgets);
     1236        }
     1237
     1238        $sidebars_widgets = $_sidebars_widgets;
     1239        unset($_sidebars_widgets, $_widgets);
     1240
     1241        // find hidden/lost multi-widget instances
     1242        $lost_widgets = array();
     1243        foreach ( $wp_registered_widgets as $key => $val ) {
     1244                if ( in_array($key, $shown_widgets, true) )
     1245                        continue;
     1246
     1247                $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key);
     1248
     1249                if ( 2 > (int) $number )
     1250                        continue;
     1251
     1252                $lost_widgets[] = $key;
     1253        }
     1254
     1255        $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']);
     1256        wp_set_sidebars_widgets($sidebars_widgets);
     1257        return $sidebars_widgets;
     1258}
  • wp-admin/widgets.php

     
    6262if ( empty( $sidebars_widgets ) )
    6363        $sidebars_widgets = wp_get_widget_defaults();
    6464
    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                 }
    87         }
    88 
    89         // if new theme has less sidebars than the old theme
    90         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 sidebars
    98         $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 instances
    116         $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 }
    13265retrieve_widgets();
    13366
    13467if ( count($wp_registered_sidebars) == 1 ) {