Make WordPress Core

Ticket #28140: 28140.3.patch

File 28140.3.patch, 3.5 KB (added by birgire, 7 years ago)
  • src/wp-includes/nav-menu.php

    diff --git src/wp-includes/nav-menu.php src/wp-includes/nav-menu.php
    index 7adf8e1..6048112 100644
    function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item 
    386386                'menu-item-object-id' => 0,
    387387                'menu-item-object' => '',
    388388                'menu-item-parent-id' => 0,
    389                 'menu-item-position' => 0,
     389                'menu-item-position' => 1,
    390390                'menu-item-type' => 'custom',
    391391                'menu-item-title' => '',
    392392                'menu-item-url' => '',
    function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item 
    400400
    401401        $args = wp_parse_args( $menu_item_data, $defaults );
    402402
    403         if ( 0 == $menu_id ) {
    404                 $args['menu-item-position'] = 1;
    405         } elseif ( 0 == (int) $args['menu-item-position'] ) {
    406                 $menu_items = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );
    407                 $last_item = array_pop( $menu_items );
    408                 $args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : count( $menu_items );
     403        if ( 0 != $menu_id && 1 == (int) $args['menu-item-position'] ) {
     404                $menu_items = (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );
     405                $last_item  = array_pop( $menu_items );
     406                if ( $last_item && isset( $last_item->menu_order ) ) {
     407                        $args['menu-item-position'] = 1 + $last_item->menu_order;
     408                } elseif ( count( $menu_items ) ) {
     409                        $args['menu-item-position'] = count( $menu_items );
     410                }
    409411        }
    410412
    411413        $original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0;
  • tests/phpunit/tests/post/nav-menu.php

    diff --git tests/phpunit/tests/post/nav-menu.php tests/phpunit/tests/post/nav-menu.php
    index 91a68ce..f5e2ecd 100644
    class Test_Nav_Menus extends WP_UnitTestCase { 
    612612                $this->assertNotContains( 'current-menu-ancestor', $post_archive_menu_item->classes );
    613613        }
    614614
     615        /**
     616         * @ticket 28140
     617         */
     618        public function test_position_for_first_menu_item_on_menu_should_be_one() {
     619
     620                $first_menu_item_id = wp_update_nav_menu_item( $this->menu_id, 0, array(
     621                        'menu-item-status'    => 'publish'
     622                ) );
     623
     624                $second_menu_item_id = wp_update_nav_menu_item( $this->menu_id, 0, array(
     625                        'menu-item-status'    => 'publish'
     626                ) );
     627
     628                $first_menu_order  = get_post_field( 'menu_order', $first_menu_item_id  );
     629                $second_menu_order = get_post_field( 'menu_order', $second_menu_item_id  );
     630
     631                $this->assertEquals( 1, $first_menu_order );
     632                $this->assertEquals( 2, $second_menu_order );
     633        }
     634
     635        /**
     636         * @ticket 28140
     637         */
     638        public function test_menu_order_in_wp_get_nav_menu_items_should_start_from_one() {
     639
     640                $first_menu_item_id = wp_update_nav_menu_item( $this->menu_id, 0, array(
     641                        'menu-item-status'    => 'publish'
     642                ) );
     643
     644                $second_menu_item_id = wp_update_nav_menu_item( $this->menu_id, 0, array(
     645                        'menu-item-status'    => 'publish'
     646                ) );
     647
     648                $menu_items = wp_get_nav_menu_items( $this->menu_id );
     649       
     650                $actual_menu_orders = wp_list_pluck( $menu_items, 'menu_order' );
     651
     652                $expected_menu_orders = array( 1, 2 );
     653
     654                $this->assertSame( $expected_menu_orders, $actual_menu_orders );
     655        }
     656
    615657}