Make WordPress Core

Changeset 52569


Ignore:
Timestamp:
01/12/2022 11:23:41 PM (5 years ago)
Author:
audrasjb
Message:

Administration: Ensure an integer is used for menu priority in add_menu_page().

This change adds a verification of the $position parameter in add_menu_page() to ensure an integer is used. If not, the function informs developers of the wrong parameter type via a _doing_it_wrong message. This brings consistency with a similar check used in add_submenu_page().

This change also typecasts any floating number to string to ensure that in case a float value was passed, at least it doesn't override existing menus.

Follow-up to [46570].

Props kirtan95.
Fixes #54798. See #48249.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/plugin.php

    r52352 r52569  
    13301330                $menu[ "$position" ] = $new_menu;
    13311331        } else {
     1332                if ( ! is_int( $position ) ) {
     1333                        _doing_it_wrong(
     1334                                __FUNCTION__,
     1335                                sprintf(
     1336                                /* translators: %s: add_submenu_page() */
     1337                                        __( 'The seventh parameter passed to %s should be an integer representing menu position.' ),
     1338                                        '<code>add_menu_page()</code>'
     1339                                ),
     1340                                '6.0.0'
     1341                        );
     1342                        // If the position is not a string (i.e. float), convert it to string.
     1343                        if ( ! is_string( $position ) ) {
     1344                                $position = (string) $position;
     1345                        }
     1346                }
    13321347                $menu[ $position ] = $new_menu;
    13331348        }
  • trunk/tests/phpunit/tests/admin/includesPlugin.php

    r52389 r52569  
    297297
    298298        /**
    299          * Passing a string as position will fail.
     299         * Passing a string as position will fail in submenu.
    300300         *
    301301         * @ticket 48599
    302302         */
    303         public function test_passing_string_as_position_fires_doing_it_wrong() {
     303        public function test_passing_string_as_position_fires_doing_it_wrong_submenu() {
    304304                $this->setExpectedIncorrectUsage( 'add_submenu_page' );
    305305                global $submenu, $menu;
    … …  
    325325        }
    326326
     327        /**
     328         * Passing a string as position will fail in menu.
     329         *
     330         * @ticket 48599
     331         */
     332        public function test_passing_string_as_position_fires_doing_it_wrong_menu() {
     333                $this->setExpectedIncorrectUsage( 'add_menu_page' );
     334                global $submenu, $menu;
     335
     336                // Reset menus.
     337                $submenu      = array();
     338                $menu         = array();
     339                $current_user = get_current_user_id();
     340                $admin_user   = self::factory()->user->create( array( 'role' => 'administrator' ) );
     341                wp_set_current_user( $admin_user );
     342                set_current_screen( 'dashboard' );
     343
     344                // Setup a menu with some items.
     345                add_menu_page( 'Main Menu', 'Main Menu', 'manage_options', 'main_slug', 'main_page_callback', 'icon_url', '1' );
     346                add_menu_page( 'Main Menu 1', 'Main Menu 1', 'manage_options', 'main1_slug', 'main1_page_callback', 'icon_url1', 1.5 );
     347
     348                // Clean up the temporary user.
     349                wp_set_current_user( $current_user );
     350                wp_delete_user( $admin_user );
     351
     352                // Verify the menu was inserted.
     353                $this->assertSame( 'main_slug', $menu[1][2] );
     354                // Verify the menu was inserted correctly on passing float as position.
     355                $this->assertSame( 'main1_slug', $menu['1.5'][2] );
     356        }
     357
    327358        public function test_is_plugin_active_true() {
    328359                activate_plugin( 'hello.php' );
Note: See TracChangeset for help on using the changeset viewer.