Changeset 46197
- Timestamp:
- 09/20/2019 02:59:04 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-admin/includes/plugin.php
r45932 r46197 1268 1268 * e.g. 'dashicons-chart-pie'. 1269 1269 * * Pass 'none' to leave div.wp-menu-image empty so an icon can be added via CSS. 1270 * @param int $position The position in the menu order this oneshould appear.1270 * @param int $position The position in the menu order this item should appear. 1271 1271 * @return string The resulting page's hook_suffix. 1272 1272 */ … … 1339 1339 * to be compatible with sanitize_key(). 1340 1340 * @param callable $function The function to be called to output the content for this page. 1341 * @param int $position The position in the menu order this item should appear. 1342 * 1341 1343 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1342 1344 */ 1343 function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1345 function add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1344 1346 global $submenu, $menu, $_wp_real_parent_file, $_wp_submenu_nopriv, 1345 1347 $_registered_pages, $_parent_pages; … … 1371 1373 } 1372 1374 1373 $submenu[ $parent_slug ][] = array( $menu_title, $capability, $menu_slug, $page_title ); 1375 $new_sub_menu = array( $menu_title, $capability, $menu_slug, $page_title ); 1376 if ( null === $position ) { 1377 $submenu[ $parent_slug ][] = $new_sub_menu; 1378 } else { 1379 // If position is equal or higher than the number of items in the array, append the submenu. 1380 if ( $position >= count( $submenu[ $parent_slug ] ) ) { 1381 $submenu[ $parent_slug ][] = $new_sub_menu; 1382 } else { 1383 // Test for a negative position. 1384 $position = max( $position, 0 ); 1385 if ( 0 === $position ) { 1386 // For negative or `0` positions, prepend the submenu. 1387 array_unshift( $submenu[ $parent_slug ], $new_sub_menu ); 1388 } else { 1389 // Grab all of the items before the insertion point. 1390 $before_items = array_slice( $submenu[ $parent_slug ], 0, $position, true ); 1391 // Grab all of the items after the insertion point. 1392 $after_items = array_slice( $submenu[ $parent_slug ], $position, null, true ); 1393 // Add the new item. 1394 $before_items[] = $new_sub_menu; 1395 // Merge the items. 1396 $submenu[ $parent_slug ] = array_merge( $before_items, $after_items ); 1397 } 1398 } 1399 } 1400 // Sort the parent array 1401 ksort( $submenu[ $parent_slug ] ); 1374 1402 1375 1403 $hookname = get_plugin_page_hookname( $menu_slug, $parent_slug ); … … 1410 1438 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1411 1439 * @param callable $function The function to be called to output the content for this page. 1440 * @param int $position The position in the menu order this item should appear. 1412 1441 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1413 1442 */ 1414 function add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1415 return add_submenu_page( 'tools.php', $page_title, $menu_title, $capability, $menu_slug, $function );1443 function add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1444 return add_submenu_page( 'tools.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1416 1445 } 1417 1446 … … 1432 1461 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1433 1462 * @param callable $function The function to be called to output the content for this page. 1463 * @param int $position The position in the menu order this item should appear. 1434 1464 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1435 1465 */ 1436 function add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1437 return add_submenu_page( 'options-general.php', $page_title, $menu_title, $capability, $menu_slug, $function );1466 function add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1467 return add_submenu_page( 'options-general.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1438 1468 } 1439 1469 … … 1454 1484 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1455 1485 * @param callable $function The function to be called to output the content for this page. 1486 * @param int $position The position in the menu order this item should appear. 1456 1487 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1457 1488 */ 1458 function add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1459 return add_submenu_page( 'themes.php', $page_title, $menu_title, $capability, $menu_slug, $function );1489 function add_theme_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1490 return add_submenu_page( 'themes.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1460 1491 } 1461 1492 … … 1476 1507 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1477 1508 * @param callable $function The function to be called to output the content for this page. 1509 * @param int $position The position in the menu order this item should appear. 1478 1510 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1479 1511 */ 1480 function add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1481 return add_submenu_page( 'plugins.php', $page_title, $menu_title, $capability, $menu_slug, $function );1512 function add_plugins_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1513 return add_submenu_page( 'plugins.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1482 1514 } 1483 1515 … … 1498 1530 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1499 1531 * @param callable $function The function to be called to output the content for this page. 1532 * @param int $position The position in the menu order this item should appear. 1500 1533 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1501 1534 */ 1502 function add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) { 1535 1536 function add_users_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1503 1537 if ( current_user_can( 'edit_users' ) ) { 1504 1538 $parent = 'users.php'; … … 1506 1540 $parent = 'profile.php'; 1507 1541 } 1508 return add_submenu_page( $parent, $page_title, $menu_title, $capability, $menu_slug, $function );1542 return add_submenu_page( $parent, $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1509 1543 } 1510 1544 /** … … 1524 1558 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1525 1559 * @param callable $function The function to be called to output the content for this page. 1560 * @param int $position The position in the menu order this item should appear. 1526 1561 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1527 1562 */ 1528 function add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1529 return add_submenu_page( 'index.php', $page_title, $menu_title, $capability, $menu_slug, $function );1563 function add_dashboard_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1564 return add_submenu_page( 'index.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1530 1565 } 1531 1566 … … 1546 1581 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1547 1582 * @param callable $function The function to be called to output the content for this page. 1583 * @param int $position The position in the menu order this item should appear. 1548 1584 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1549 1585 */ 1550 function add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1551 return add_submenu_page( 'edit.php', $page_title, $menu_title, $capability, $menu_slug, $function );1586 function add_posts_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1587 return add_submenu_page( 'edit.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1552 1588 } 1553 1589 … … 1568 1604 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1569 1605 * @param callable $function The function to be called to output the content for this page. 1606 * @param int $position The position in the menu order this item should appear. 1570 1607 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1571 1608 */ 1572 function add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1573 return add_submenu_page( 'upload.php', $page_title, $menu_title, $capability, $menu_slug, $function );1609 function add_media_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1610 return add_submenu_page( 'upload.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1574 1611 } 1575 1612 … … 1590 1627 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1591 1628 * @param callable $function The function to be called to output the content for this page. 1629 * @param int $position The position in the menu order this item should appear. 1592 1630 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1593 1631 */ 1594 function add_links_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1595 return add_submenu_page( 'link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $function );1632 function add_links_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1633 return add_submenu_page( 'link-manager.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1596 1634 } 1597 1635 … … 1612 1650 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1613 1651 * @param callable $function The function to be called to output the content for this page. 1652 * @param int $position The position in the menu order this item should appear. 1614 1653 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1615 1654 */ 1616 function add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1617 return add_submenu_page( 'edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $function );1655 function add_pages_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1656 return add_submenu_page( 'edit.php?post_type=page', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1618 1657 } 1619 1658 … … 1634 1673 * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). 1635 1674 * @param callable $function The function to be called to output the content for this page. 1675 * @param int $position The position in the menu order this item should appear. 1636 1676 * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability required. 1637 1677 */ 1638 function add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function = '' ) {1639 return add_submenu_page( 'edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $function );1678 function add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $position = null ) { 1679 return add_submenu_page( 'edit-comments.php', $page_title, $menu_title, $capability, $menu_slug, $function, $position ); 1640 1680 } 1641 1681 -
trunk/tests/phpunit/tests/admin/includesPlugin.php
r45607 r46197 58 58 } 59 59 60 /** 61 * Tests the priority parameter. 62 * 63 * @ticket 39776 64 * 65 * @covers ::add_submenu_page 66 * 67 * @param int $priority The position of the new item. 68 * @param int $expected_position Where the new item is expected to appear. 69 * 70 * @dataProvider data_submenu_priority 71 */ 72 function test_submenu_priority( $priority, $expected_position ) { 73 global $submenu; 74 global $menu; 75 $current_user = get_current_user_id(); 76 $admin_user = self::factory()->user->create( array( 'role' => 'administrator' ) ); 77 wp_set_current_user( $admin_user ); 78 set_current_screen( 'dashboard' ); 79 80 // Setup a menu with some items. 81 $parent = add_menu_page( 'Test Toplevel', 'Test Toplevel', 'manage_options', 'mt-top-level-handle', 'mt_toplevel_page' ); 82 foreach ( $this->submenus_to_add() as $menu_to_add ) { 83 add_submenu_page( $parent, $menu_to_add[0], $menu_to_add[1], $menu_to_add[2], $menu_to_add[3], $menu_to_add[4] ); 84 } 85 86 // Insert the new page. 87 add_submenu_page( $parent, 'New Page', 'New Page', 'manage_options', 'custom-position', 'custom_pos', $priority ); 88 wp_set_current_user( $current_user ); 89 90 // Clean up the temporary user. 91 wp_delete_user( $admin_user ); 92 93 // Verify the menu was inserted at the expected position. 94 $this->assertSame( 'custom-position', $submenu[ $parent ][ $expected_position ][2] ); 95 } 96 97 /** 98 * Tests the priority parameter for menu helper functions. 99 * 100 * @ticket 39776 101 * 102 * @covers ::add_management_page 103 * @covers ::add_options_page 104 * @covers ::add_theme_page 105 * @covers ::add_plugins_page 106 * @covers ::add_users_page 107 * @covers ::add_dashboard_page 108 * @covers ::add_posts_page 109 * @covers ::add_media_page 110 * @covers ::add_links_page 111 * @covers ::add_pages_page 112 * @covers ::add_comments_page 113 * 114 * @param int $priority The position of the new item. 115 * @param int $expected_position Where the new item is expected to appear. 116 * 117 * @dataProvider data_submenu_priority 118 */ 119 function test_submenu_helpers_priority( $priority, $expected_position ) { 120 global $submenu; 121 global $menu; 122 123 // Skip for multisite. 124 if ( is_multisite() ) { 125 return; 126 } 127 128 // Reset menus. 129 $submenu = array(); 130 $menu = array(); 131 132 $current_user = get_current_user_id(); 133 $admin_user = self::factory()->user->create( array( 'role' => 'administrator' ) ); 134 wp_set_current_user( $admin_user ); 135 set_current_screen( 'dashboard' ); 136 137 // Test the helper functions that use `add_submenu_page`. Each helper adds to a specific menu root. 138 $helper_functions = array( 139 array( 140 'callback' => 'add_management_page', 141 'menu_root' => 'tools.php', 142 ), 143 array( 144 'callback' => 'add_options_page', 145 'menu_root' => 'options-general.php', 146 ), 147 array( 148 'callback' => 'add_theme_page', 149 'menu_root' => 'themes.php', 150 ), 151 array( 152 'callback' => 'add_plugins_page', 153 'menu_root' => 'plugins.php', 154 ), 155 array( 156 'callback' => 'add_users_page', 157 'menu_root' => 'users.php', 158 ), 159 array( 160 'callback' => 'add_dashboard_page', 161 'menu_root' => 'index.php', 162 ), 163 array( 164 'callback' => 'add_posts_page', 165 'menu_root' => 'edit.php', 166 ), 167 array( 168 'callback' => 'add_media_page', 169 'menu_root' => 'upload.php', 170 ), 171 array( 172 'callback' => 'add_links_page', 173 'menu_root' => 'link-manager.php', 174 ), 175 array( 176 'callback' => 'add_pages_page', 177 'menu_root' => 'edit.php?post_type=page', 178 ), 179 array( 180 'callback' => 'add_comments_page', 181 'menu_root' => 'edit-comments.php', 182 ), 183 ); 184 185 $actual_positions = array(); 186 187 foreach ( $helper_functions as $helper_function ) { 188 189 // Build up demo pages on the menu root. 190 foreach ( $this->submenus_to_add() as $menu_to_add ) { 191 add_menu_page( $menu_to_add[0], $menu_to_add[1], $menu_to_add[2], $helper_function['menu_root'], $helper_function['menu_root'] ); 192 } 193 194 $test = 'test_' . $helper_function['callback']; 195 196 // Call the helper function, passing the desired priority. 197 call_user_func_array( $helper_function['callback'], array( $test, $test, 'manage_options', 'custom-position', '', $priority ) ); 198 199 $actual_positions[ $test ] = $submenu[ $helper_function['menu_root'] ][ $expected_position ][2]; 200 } 201 202 // Clean up the temporary user. 203 wp_delete_user( $admin_user ); 204 205 foreach ( $actual_positions as $test => $actual_position ) { 206 // Verify the menu was inserted at the expected position. 207 $this->assertSame( 'custom-position', $actual_position, 'Menu not inserted at the expected position with ' . $test ); 208 } 209 } 210 211 /** 212 * Helper to store the menus that are to be added, so getting the length is programmatically done. 213 * 214 * @since 5.3.0 215 * 216 * @return array { 217 * @type array { 218 * @type string Page title. 219 * @type string Menu_title. 220 * @type string Capability. 221 * @type string Menu slug. 222 * @type string Function. 223 * } 224 * } 225 */ 226 function submenus_to_add() { 227 return array( 228 array( 'Submenu Priority', 'Submenu Priority', 'manage_options', 'sub-page', '' ), 229 array( 'Submenu Priority 2', 'Submenu Priority 2', 'manage_options', 'sub-page2', '' ), 230 array( 'Submenu Priority 3', 'Submenu Priority 3', 'manage_options', 'sub-page3', '' ), 231 array( 'Submenu Priority 4', 'Submenu Priority 4', 'manage_options', 'sub-page4', '' ), 232 array( 'Submenu Priority 5', 'Submenu Priority 5', 'manage_options', 'sub-page5', '' ), 233 ); 234 } 235 236 /** 237 * Data provider for test_submenu_helpers_priority(). 238 * 239 * @since 5.3.0 240 * 241 * @return array { 242 * @type array { 243 * @type int|null Priority. 244 * @type int Expected position. 245 * } 246 * } 247 */ 248 function data_submenu_priority() { 249 $menu_count = count( $this->submenus_to_add() ); 250 return array( 251 array( null, $menu_count ), // Insert at the end of the menu if null is passed. Default behavior. 252 array( 0, 0 ), // Insert at the beginning of the menu if 0 is passed. 253 array( -1, 0 ), // Negative numbers are treated the same as passing 0. 254 array( -7, 0 ), // Negative numbers are treated the same as passing 0. 255 array( 1, 1 ), // Insert as the second item. 256 array( 3, 3 ), // Insert as the 4th item. 257 array( $menu_count, $menu_count ), // Numbers equal to the number of items are added at the end. 258 array( 123456, $menu_count ), // Numbers higher than the number of items are added at the end. 259 ); 260 } 261 60 262 function test_is_plugin_active_true() { 61 263 activate_plugin( 'hello.php' );
Note: See TracChangeset
for help on using the changeset viewer.