WordPressを読む 68-4 /blog/wp-includes/widgets.php 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | /** * Look for "lost" widgets, this has to run at least on each theme change. * * @since 2.8.0 * * @param mixed $theme_changed Whether the theme was changed as a boolean. A value * of 'customize' defers updates for the customizer. * @return array */ function retrieve_widgets( $theme_changed = false ) { global $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']; if ( 'customize' !== $theme_changed ) { remove_theme_mod( 'sidebars_widgets' ); } foreach ( $_sidebars_widgets as $sidebar => $widgets ) { if ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) { continue; } if ( !in_array( $sidebar, $registered_sidebar_keys ) ) { $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $widgets; unset( $_sidebars_widgets[$sidebar] ); } } } else { if ( empty( $sidebars_widgets ) ) return; unset( $sidebars_widgets['array_version'] ); $old = array_keys($sidebars_widgets); sort($old); sort($registered_sidebar_keys); if ( $old == $registered_sidebar_keys ) return; $_sidebars_widgets = array( 'wp_inactive_widgets' => !empty( $sidebars_widgets['wp_inactive_widgets'] ) ? $sidebars_widgets['wp_inactive_widgets'] : array() ); unset( $sidebars_widgets['wp_inactive_widgets'] ); 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 ) ) $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val; } } // discard invalid, theme-specific widgets from sidebars $shown_widgets = array(); foreach ( $_sidebars_widgets as $sidebar => $widgets ) { if ( !is_array($widgets) ) continue; $_widgets = array(); foreach ( $widgets as $widget ) { if ( isset($wp_registered_widgets[$widget]) ) $_widgets[] = $widget; } $_sidebars_widgets[$sidebar] = $_widgets; $shown_widgets = array_merge($shown_widgets, $_widgets); } $sidebars_widgets = $_sidebars_widgets; unset($_sidebars_widgets, $_widgets); // find hidden/lost multi-widget instances $lost_widgets = array(); foreach ( $wp_registered_widgets as $key => $val ) { if ( in_array($key, $shown_widgets, true) ) continue; $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); if ( 2 > (int) $number ) continue; $lost_widgets[] = $key; } $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); if ( 'customize' !== $theme_changed ) { wp_set_sidebars_widgets( $sidebars_widgets ); } return $sidebars_widgets; } |