Ticket #39693: 39693.8.diff
File 39693.8.diff, 22.5 KB (added by , 8 years ago) |
---|
-
src/wp-includes/theme.php
679 679 function switch_theme( $stylesheet ) { 680 680 global $wp_theme_directories, $wp_customize, $sidebars_widgets; 681 681 682 $_sidebars_widgets = null;683 if ( 'wp_ajax_customize_save' === current_action() ) {684 $_sidebars_widgets = $wp_customize->post_value( $wp_customize->get_setting( 'old_sidebars_widgets_data' ) );685 } elseif ( is_array( $sidebars_widgets ) ) {686 $_sidebars_widgets = $sidebars_widgets;687 }688 689 if ( is_array( $_sidebars_widgets ) ) {690 set_theme_mod( 'sidebars_widgets', array( 'time' => time(), 'data' => $_sidebars_widgets ) );691 }692 693 682 $nav_menu_locations = get_theme_mod( 'nav_menu_locations' ); 694 683 add_option( 'theme_switch_menu_locations', $nav_menu_locations ); 695 684 … … 716 705 717 706 update_option( 'current_theme', $new_name ); 718 707 708 $_sidebars_widgets = null; 709 if ( 'wp_ajax_customize_save' === current_action() ) { 710 $old_sidebars_widgets_data_setting = $wp_customize->get_setting( 'old_sidebars_widgets_data' ); 711 if ( $old_sidebars_widgets_data_setting ) { 712 $_sidebars_widgets = $wp_customize->post_value( $old_sidebars_widgets_data_setting ); 713 } 714 } elseif ( is_array( $sidebars_widgets ) ) { 715 $_sidebars_widgets = $sidebars_widgets; 716 } 717 718 if ( is_array( $_sidebars_widgets ) ) { 719 set_theme_mod( 'sidebars_widgets', array( 720 'time' => time(), 721 'data' => $_sidebars_widgets, 722 ) ); 723 } 724 719 725 // Migrate from the old mods_{name} option to theme_mods_{slug}. 720 726 if ( is_admin() && false === get_option( 'theme_mods_' . $stylesheet ) ) { 721 727 $default_theme_mods = (array) get_option( 'mods_' . $new_name ); -
src/wp-includes/widgets.php
919 919 * @since 2.2.0 920 920 * @access private 921 921 * 922 * @global array $_wp_sidebars_widgets 922 923 * @param array $sidebars_widgets Sidebar widgets and their settings. 923 924 */ 924 925 function wp_set_sidebars_widgets( $sidebars_widgets ) { 925 if ( !isset( $sidebars_widgets['array_version'] ) ) 926 global $_wp_sidebars_widgets; 927 928 // Clear cached value used in wp_get_sidebars_widgets(). 929 $_wp_sidebars_widgets = null; 930 931 if ( ! isset( $sidebars_widgets['array_version'] ) ) { 926 932 $sidebars_widgets['array_version'] = 3; 933 } 934 927 935 update_option( 'sidebars_widgets', $sidebars_widgets ); 928 936 } 929 937 … … 1113 1121 * 1114 1122 * @param string|bool $theme_changed Whether the theme was changed as a boolean. A value 1115 1123 * of 'customize' defers updates for the Customizer. 1116 * @return array |void1124 * @return array Updated sidebars widgets. 1117 1125 */ 1118 1126 function retrieve_widgets( $theme_changed = false ) { 1119 1127 global $wp_registered_sidebars, $sidebars_widgets, $wp_registered_widgets; 1120 1128 1121 $registered_sidebar_keys = array_keys( $wp_registered_sidebars ); 1122 $orphaned = 0; 1129 $registered_sidebars_keys = array_keys( $wp_registered_sidebars ); 1130 $registered_widgets_ids = array_keys( $wp_registered_widgets ); 1131 $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' ); 1123 1132 1124 $old_sidebars_widgets = get_theme_mod( 'sidebars_widgets' );1125 1133 if ( is_array( $old_sidebars_widgets ) ) { 1126 1134 // time() that sidebars were stored is in $old_sidebars_widgets['time'] 1127 $ _sidebars_widgets = $old_sidebars_widgets['data'];1135 $sidebars_widgets = $old_sidebars_widgets['data']; 1128 1136 1129 1137 if ( 'customize' !== $theme_changed ) { 1130 1138 remove_theme_mod( 'sidebars_widgets' ); 1131 1139 } 1140 } else { 1141 if ( empty( $sidebars_widgets ) ) { 1142 return array(); 1143 } 1132 1144 1133 foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 1134 if ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) { 1135 continue; 1136 } 1145 unset( $sidebars_widgets['array_version'] ); 1137 1146 1138 if ( !in_array( $sidebar, $registered_sidebar_keys ) ) { 1139 $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $widgets; 1140 unset( $_sidebars_widgets[$sidebar] ); 1141 } 1147 $sidebars_widgets_keys = array_keys( $sidebars_widgets ); 1148 sort( $sidebars_widgets_keys ); 1149 sort( $registered_sidebars_keys ); 1150 1151 if ( $sidebars_widgets_keys === $registered_sidebars_keys ) { 1152 $sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids ); 1153 1154 return $sidebars_widgets; 1142 1155 } 1143 } else { 1144 if ( empty( $sidebars_widgets ) ) 1145 return; 1156 } 1146 1157 1147 unset( $sidebars_widgets['array_version'] ); 1158 // Discard invalid, theme-specific widgets from sidebars. 1159 $sidebars_widgets = _wp_remove_unregistered_widgets( $sidebars_widgets, $registered_widgets_ids ); 1160 $sidebars_widgets = wp_map_sidebars_widgets( $sidebars_widgets ); 1148 1161 1149 $old = array_keys($sidebars_widgets); 1150 sort($old); 1151 sort($registered_sidebar_keys); 1152 1153 if ( $old == $registered_sidebar_keys ) 1154 return; 1155 1156 $_sidebars_widgets = array( 1157 'wp_inactive_widgets' => !empty( $sidebars_widgets['wp_inactive_widgets'] ) ? $sidebars_widgets['wp_inactive_widgets'] : array() 1158 ); 1159 1160 unset( $sidebars_widgets['wp_inactive_widgets'] ); 1161 1162 foreach ( $wp_registered_sidebars as $id => $settings ) { 1163 if ( $theme_changed ) { 1164 $_sidebars_widgets[$id] = array_shift( $sidebars_widgets ); 1165 } else { 1166 // no theme change, grab only sidebars that are currently registered 1167 if ( isset( $sidebars_widgets[$id] ) ) { 1168 $_sidebars_widgets[$id] = $sidebars_widgets[$id]; 1169 unset( $sidebars_widgets[$id] ); 1170 } 1171 } 1162 // Find hidden/lost multi-widget instances. 1163 $shown_widgets = call_user_func_array( 'array_merge', $sidebars_widgets ); 1164 $lost_widgets = array_diff( $registered_widgets_ids, $shown_widgets ); 1165 1166 foreach ( $lost_widgets as $key => $widget_id ) { 1167 $number = preg_replace( '/.+?-([0-9]+)$/', '$1', $widget_id ); 1168 1169 // Only keep active and default widgets. 1170 if ( is_numeric( $number ) && (int) $number < 2 ) { 1171 unset( $lost_widgets[ $key ] ); 1172 1172 } 1173 } 1174 $sidebars_widgets['wp_inactive_widgets'] = array_merge( $lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets'] ); 1175 1176 if ( 'customize' !== $theme_changed ) { 1177 wp_set_sidebars_widgets( $sidebars_widgets ); 1178 } 1179 1180 return $sidebars_widgets; 1181 } 1182 1183 /** 1184 * Compares a list of sidebars with their widgets against a whitelist. 1185 * 1186 * @since 4.9.0 1187 * 1188 * @param array $old_sidebars_widgets List of sidebars and their widget instance IDs. 1189 * @return array Mapped sidebars widgets. 1190 */ 1191 function wp_map_sidebars_widgets( $old_sidebars_widgets ) { 1192 global $wp_registered_sidebars; 1193 1194 $new_sidebars_widgets = array( 1195 'wp_inactive_widgets' => array(), 1196 ); 1197 1198 // Short-circuit if there are no sidebars to map. 1199 if ( ! is_array( $old_sidebars_widgets ) || empty( $old_sidebars_widgets ) ) { 1200 return $new_sidebars_widgets; 1201 } 1173 1202 1174 foreach ( $sidebars_widgets as $val ) { 1175 if ( is_array($val) && ! empty( $val ) ) 1176 $_sidebars_widgets['orphaned_widgets_' . ++$orphaned] = $val; 1203 foreach ( $old_sidebars_widgets as $sidebar => $widgets ) { 1204 if ( 'wp_inactive_widgets' === $sidebar || 'orphaned_widgets' === substr( $sidebar, 0, 16 ) ) { 1205 $new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], (array) $widgets ); 1206 unset( $old_sidebars_widgets[ $sidebar ] ); 1177 1207 } 1178 1208 } 1179 1209 1180 // discard invalid, theme-specific widgets from sidebars 1181 $shown_widgets = array(); 1210 // If old and new theme have just one sidebar, map it and we're done. 1211 if ( 1 === count( $old_sidebars_widgets ) && 1 === count( $wp_registered_sidebars ) ) { 1212 $new_sidebars_widgets[ key( $wp_registered_sidebars ) ] = array_pop( $old_sidebars_widgets ); 1213 1214 return $new_sidebars_widgets; 1215 } 1182 1216 1183 foreach ( $_sidebars_widgets as $sidebar => $widgets ) { 1184 if ( !is_array($widgets) ) 1185 continue; 1217 // Map locations with the same slug. 1218 $old_sidebars = array_keys( $old_sidebars_widgets ); 1186 1219 1187 $_widgets = array(); 1188 foreach ( $widgets as $widget ) { 1189 if ( isset($wp_registered_widgets[$widget]) ) 1190 $_widgets[] = $widget; 1220 foreach ( $wp_registered_sidebars as $sidebar => $name ) { 1221 if ( in_array( $sidebar, $old_sidebars, true ) ) { 1222 $new_sidebars_widgets[ $sidebar ] = $old_sidebars_widgets[ $sidebar ]; 1223 unset( $old_sidebars_widgets[ $sidebar ] ); 1224 } else { 1225 $new_sidebars_widgets[ $sidebar ] = array(); 1191 1226 } 1227 } 1192 1228 1193 $_sidebars_widgets[$sidebar] = $_widgets; 1194 $shown_widgets = array_merge($shown_widgets, $_widgets); 1229 // If there are no old sidebars left, then we're done. 1230 if ( empty( $old_sidebars_widgets ) ) { 1231 return $new_sidebars_widgets; 1195 1232 } 1196 1233 1197 $sidebars_widgets = $_sidebars_widgets; 1198 unset($_sidebars_widgets, $_widgets); 1234 /* 1235 * If old and new theme both have sidebars that contain phrases 1236 * from within the same group, make an educated guess and map it. 1237 */ 1238 $common_slug_groups = array( 1239 array( 'sidebar', 'primary', 'main', 'right' ), 1240 array( 'second', 'left' ), 1241 array( 'sidebar-2', 'footer', 'bottom' ), 1242 array( 'header', 'top' ), 1243 ); 1244 1245 // Go through each group... 1246 foreach ( $common_slug_groups as $slug_group ) { 1199 1247 1200 // find hidden/lost multi-widget instances 1201 $lost_widgets = array(); 1202 foreach ( $wp_registered_widgets as $key => $val ) { 1203 if ( in_array($key, $shown_widgets, true) ) 1204 continue; 1248 // ...and see if any of these slugs... 1249 foreach ( $slug_group as $slug ) { 1205 1250 1206 $number = preg_replace('/.+?-([0-9]+)$/', '$1', $key); 1251 // ...and any of the new sidebars... 1252 foreach ( $wp_registered_sidebars as $new_sidebar => $args ) { 1253 1254 // ...actually match! 1255 if ( false === stripos( $new_sidebar, $slug ) && false === stripos( $slug, $new_sidebar ) ) { 1256 continue; 1257 } 1207 1258 1208 if ( 2 > (int) $number )1209 continue;1259 // Then see if any of the old sidebars... 1260 foreach ( $old_sidebars_widgets as $sidebar => $widgets ) { 1210 1261 1211 $lost_widgets[] = $key; 1262 // ...and any slug in the same group... 1263 foreach ( $slug_group as $slug ) { 1264 1265 // ... have a match as well. 1266 if ( false === stripos( $sidebar, $slug ) && false === stripos( $slug, $sidebar ) ) { 1267 continue; 1268 } 1269 1270 // Make sure this sidebar wasn't mapped and removed previously. 1271 if ( ! empty( $old_sidebars_widgets[ $sidebar ] ) ) { 1272 1273 // We have a match that can be mapped! 1274 $new_sidebars_widgets[ $new_sidebar ] = array_merge( $new_sidebars_widgets[ $new_sidebar ], $old_sidebars_widgets[ $sidebar ] ); 1275 1276 // Remove the mapped sidebar so it can't be mapped again. 1277 unset( $old_sidebars_widgets[ $sidebar ] ); 1278 1279 // Go back and check the next new sidebar. 1280 continue 3; 1281 } 1282 } // endforeach ( $slug_group as $slug ) 1283 } // endforeach ( $old_sidebars_widgets as $sidebar => $menu_id ) 1284 } // endforeach foreach ( $wp_registered_sidebars as $new_sidebar => $name ) 1285 } // endforeach ( $slug_group as $slug ) 1286 } // endforeach ( $common_slug_groups as $slug_group ) 1287 1288 foreach ( $old_sidebars_widgets as $widgets ) { 1289 if ( is_array( $widgets ) && ! empty( $widgets ) ) { 1290 $new_sidebars_widgets['wp_inactive_widgets'] = array_merge( $new_sidebars_widgets['wp_inactive_widgets'], (array) $widgets ); 1291 } 1212 1292 } 1213 1293 1214 $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']); 1215 if ( 'customize' !== $theme_changed ) { 1216 wp_set_sidebars_widgets( $sidebars_widgets ); 1294 return $new_sidebars_widgets; 1295 } 1296 1297 /** 1298 * Compares a list of sidebars with their widgets against a whitelist. 1299 * 1300 * @since 4.9.0 1301 * 1302 * @param array $sidebars_widgets List of sidebars and their widget instance IDs. 1303 * @param array $whitelist List of widget IDs to compare against. 1304 * @return array Sidebars with whitelisted widgets. 1305 */ 1306 function _wp_remove_unregistered_widgets( $sidebars_widgets, $whitelist ) { 1307 foreach ( $sidebars_widgets as $sidebar => $widgets ) { 1308 if ( is_array( $widgets ) ) { 1309 $sidebars_widgets[ $sidebar ] = array_intersect( $widgets, $whitelist ); 1310 } 1217 1311 } 1218 1312 1219 1313 return $sidebars_widgets; -
tests/phpunit/tests/widgets.php
726 726 727 727 $_wp_sidebars_widgets = array(); 728 728 $this->assertInternalType( 'array', $result ); 729 $this->assert NotEmpty( $result);729 $this->assertEquals( $result, $sidebars_widgets ); 730 730 731 731 foreach ( $sidebars_widgets as $widgets ) { 732 732 $this->assertInternalType( 'array', $widgets ); … … 734 734 735 735 $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 736 736 $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 737 $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] );738 737 739 738 // Unregistered widget should be filtered out. 740 739 $this->assertEmpty( $sidebars_widgets['sidebar-3'] ); 741 740 742 // 6 default widgets - 1 active text widget = 5. 743 $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] ); 741 // 6 default widgets - 1 active text widget + 1 orphaned widget = 6. 742 $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] ); 743 744 744 $this->assertContains( 'meta-2', $sidebars_widgets['wp_inactive_widgets'] ); 745 745 $this->assertContains( 'search-2', $sidebars_widgets['wp_inactive_widgets'] ); 746 $this->assertContains( 'archives-2', $sidebars_widgets['wp_inactive_widgets'] ); 746 747 $this->assertContains( 'categories-2', $sidebars_widgets['wp_inactive_widgets'] ); 747 748 $this->assertContains( 'recent-posts-2', $sidebars_widgets['wp_inactive_widgets'] ); 748 749 $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] ); … … 775 776 $result = retrieve_widgets( true ); 776 777 777 778 // $sidebars_widgets matches registered sidebars. 778 $this->assertNull( $result ); 779 $this->assertInternalType( 'array', $result ); 780 $this->assertEquals( $result, $sidebars_widgets ); 779 781 780 782 foreach ( $sidebars_widgets as $widgets ) { 781 783 $this->assertInternalType( 'array', $widgets ); … … 784 786 $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 785 787 $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 786 788 787 // No widget validity checkwhen $sidebars_widgets matches registered sidebars.788 $this->assert Contains( 'custom_widget-1',$sidebars_widgets['sidebar-3'] );789 // Invalid widget removed, even when $sidebars_widgets matches registered sidebars. 790 $this->assertEmpty( $sidebars_widgets['sidebar-3'] ); 789 791 790 792 // No lost widgets when $sidebars_widgets matches registered sidebars. 791 793 $this->assertEmpty( $sidebars_widgets['wp_inactive_widgets'] ); … … 814 816 815 817 $_wp_sidebars_widgets = array(); 816 818 $this->assertInternalType( 'array', $result ); 817 $this->assert NotEmpty( $result);819 $this->assertEquals( $result, $sidebars_widgets ); 818 820 819 821 foreach ( $sidebars_widgets as $widgets ) { 820 822 $this->assertInternalType( 'array', $widgets ); … … 857 859 858 860 $_wp_sidebars_widgets = array(); 859 861 $this->assertInternalType( 'array', $result ); 860 $this->assert NotEmpty( $result);862 $this->assertEquals( $result, $sidebars_widgets ); 861 863 862 864 foreach ( $sidebars_widgets as $widgets ) { 863 865 $this->assertInternalType( 'array', $widgets ); 864 866 } 865 867 866 /* 867 * Only returns intersection of registered sidebars and saved sidebars, 868 * so neither fantasy-sidebar nor sidebar-3 will make the cut. 869 */ 868 // This sidebar is not registered anymore. 870 869 $this->assertArrayNotHasKey( 'fantasy', $sidebars_widgets ); 871 $this->assertArray NotHasKey( 'sidebar-3', $sidebars_widgets );870 $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets ); 872 871 873 // archives-2 ends up as an orphan because of the above behavior.874 $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] );875 872 $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 876 873 $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 877 874 878 875 // 6 default widgets - 1 active text widget = 5. 879 $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] );876 $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] ); 880 877 881 878 $this->assertContains( 'meta-2', $sidebars_widgets['wp_inactive_widgets'] ); 882 879 $this->assertContains( 'search-2', $sidebars_widgets['wp_inactive_widgets'] ); 880 // archives-2 ends up as inactive because fantasy sidebar doesn't exist. 881 $this->assertContains( 'archives-2', $sidebars_widgets['wp_inactive_widgets'] ); 883 882 $this->assertContains( 'categories-2', $sidebars_widgets['wp_inactive_widgets'] ); 884 883 $this->assertContains( 'recent-posts-2', $sidebars_widgets['wp_inactive_widgets'] ); 885 884 $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] ); … … 915 914 916 915 $_wp_sidebars_widgets = array(); 917 916 $this->assertInternalType( 'array', $result ); 918 $this->assert NotEmpty( $result);917 $this->assertEquals( $result, $sidebars_widgets ); 919 918 920 919 foreach ( $sidebars_widgets as $widgets ) { 921 920 $this->assertInternalType( 'array', $widgets ); … … 923 922 924 923 $this->assertContains( 'tag_cloud-1', $sidebars_widgets['sidebar-1'] ); 925 924 $this->assertContains( 'text-1', $sidebars_widgets['sidebar-2'] ); 926 $this->assertContains( 'archives-2', $sidebars_widgets['orphaned_widgets_1'] );927 925 $this->assertArrayHasKey( 'sidebar-3', $sidebars_widgets ); 928 926 $this->assertEmpty( $sidebars_widgets['sidebar-3'] ); 929 $this->assertCount( 5, $sidebars_widgets['wp_inactive_widgets'] );927 $this->assertCount( 6, $sidebars_widgets['wp_inactive_widgets'] ); 930 928 931 929 $this->assertContains( 'meta-2', $sidebars_widgets['wp_inactive_widgets'] ); 932 930 $this->assertContains( 'search-2', $sidebars_widgets['wp_inactive_widgets'] ); 931 $this->assertContains( 'archives-2', $sidebars_widgets['wp_inactive_widgets'] ); 933 932 $this->assertContains( 'categories-2', $sidebars_widgets['wp_inactive_widgets'] ); 934 933 $this->assertContains( 'recent-posts-2', $sidebars_widgets['wp_inactive_widgets'] ); 935 934 $this->assertContains( 'recent-comments-2', $sidebars_widgets['wp_inactive_widgets'] ); … … 940 939 // Sidebar_widgets option was not updated. 941 940 $this->assertNotEquals( $sidebars_widgets, wp_get_sidebars_widgets() ); 942 941 } 942 943 function test_retreive_widgets_with_single_widget() { 944 global $sidebars_widgets; 945 946 wp_widgets_init(); 947 948 // Register single-dimension widget. 949 wp_register_sidebar_widget( 'single', 'Single', '__return_false', array(), array() ); 950 wp_register_widget_control( 'single', 'Single', '__return_false', array(), array() ); 951 952 $this->register_sidebars( array( 'sidebar-1', 'sidebar-2', 'wp_inactive_widgets' ) ); 953 954 $sidebars_widgets = array( 955 'sidebar-1' => array( 'tag_cloud-1' ), 956 'wp_inactive_widgets' => array(), 957 ); 958 959 // Theme changed. 960 $result = retrieve_widgets( true ); 961 962 $this->assertContains( 'single', $result['wp_inactive_widgets'] ); 963 } 964 965 /** 966 * Test _wp_remove_unregistered_widgets. 967 * 968 * @covers _wp_remove_unregistered_widgets() 969 */ 970 public function test__wp_remove_unregistered_widgets() { 971 $widgets = array( 972 'sidebar-1' => array( 'tag_cloud-1' ), 973 'sidebar-2' => array( 'text-1' ), 974 'fantasy' => array( 'archives-2' ), 975 'wp_inactive_widgets' => array(), 976 'array_version' => 3, 977 ); 978 979 $whitelist = array( 'tag_cloud-1', 'text-1' ); 980 981 $filtered_widgets = _wp_remove_unregistered_widgets( $widgets, $whitelist ); 982 983 $this->assertInternalType( 'array', $filtered_widgets ); 984 $this->assertArrayHasKey( 'fantasy', $filtered_widgets ); 985 $this->assertEmpty( $filtered_widgets['fantasy'] ); 986 $this->assertArrayHasKey( 'array_version', $filtered_widgets ); 987 $this->assertEquals( 3, $filtered_widgets['array_version'] ); 988 $this->assertInternalType( 'integer', $filtered_widgets['array_version'] ); 989 } 990 991 /** 992 * wp_map_sidebars_widgets Tests. 993 */ 994 995 /** 996 * Two themes with one sidebar each should just map, switching to a theme not previously-active. 997 * 998 * @covers wp_map_sidebars_widgets() 999 */ 1000 public function test_one_sidebar_each() { 1001 $this->register_sidebars( array( 'primary' ) ); 1002 $prev_theme_sidebars = array( 1003 'unique-slug' => 1, 1004 ); 1005 1006 $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars ); 1007 1008 $expected_sidebars = array( 1009 'primary' => 1, 1010 'wp_inactive_widgets' => array(), 1011 ); 1012 $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars ); 1013 } 1014 1015 /** 1016 * Sidebars with the same name should map, switching to a theme not previously-active. 1017 * 1018 * @covers wp_map_sidebars_widgets() 1019 */ 1020 public function test_sidebars_with_same_slug() { 1021 $this->register_sidebars( array( 'primary', 'secondary' ) ); 1022 $prev_theme_sidebars = array( 1023 'primary' => 1, 1024 'secondary' => 2, 1025 'wp_inactive_widgets' => array(), 1026 ); 1027 1028 $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars ); 1029 1030 $this->assertEquals( $prev_theme_sidebars, $new_next_theme_sidebars ); 1031 } 1032 1033 /** 1034 * Make educated guesses on theme sidebars. 1035 * 1036 * @covers wp_map_sidebars_widgets() 1037 */ 1038 public function test_sidebar_guessing() { 1039 $this->register_sidebars( array( 'primary', 'secondary' ) ); 1040 1041 $prev_theme_sidebars = array( 1042 'header' => array(), 1043 'footer' => array(), 1044 ); 1045 1046 $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars ); 1047 1048 $expected_sidebars = array( 1049 'primary' => array(), 1050 'secondary' => array(), 1051 'wp_inactive_widgets' => array(), 1052 ); 1053 $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars ); 1054 } 1055 1056 /** 1057 * Make sure two sidebars that fall in the same group don't get the same menu assigned. 1058 * 1059 * @covers wp_map_sidebars_widgets() 1060 */ 1061 public function test_sidebar_guessing_one_menu_per_group() { 1062 $this->register_sidebars( array( 'primary' ) ); 1063 $prev_theme_sidebars = array( 1064 'top-menu' => array(), 1065 'secondary' => array(), 1066 ); 1067 1068 $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars ); 1069 1070 $expected_sidebars = array( 1071 'main' => array(), 1072 'wp_inactive_widgets' => array(), 1073 ); 1074 $this->assertEqualSets( $expected_sidebars, $new_next_theme_sidebars ); 1075 } 1076 1077 /** 1078 * Make sure two sidebars that fall in the same group get menus assigned from the same group. 1079 * 1080 * @covers wp_map_sidebars_widgets() 1081 */ 1082 public function test_sidebar_guessing_one_menu_per_sidebar() { 1083 $this->register_sidebars( array( 'primary', 'main' ) ); 1084 1085 $prev_theme_sidebars = array( 1086 'navigation-menu' => array(), 1087 'top-menu' => array(), 1088 ); 1089 1090 $new_next_theme_sidebars = wp_map_sidebars_widgets( $prev_theme_sidebars ); 1091 1092 $expected_sidebars = array( 1093 'main' => array(), 1094 'primary' => array(), 1095 'wp_inactive_widgets' => array(), 1096 ); 1097 $this->assertEquals( $expected_sidebars, $new_next_theme_sidebars ); 1098 } 943 1099 }