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