Make WordPress Core

Ticket #28138: 28138.3.diff

File 28138.3.diff, 5.9 KB (added by ericmann, 10 years ago)

Alternative patch with is_array() check instead of implode()ing and re-explode()ing the array.

  • src/wp-includes/nav-menu.php

     
    350350                return $menu;
    351351        }
    352352
    353         $defaults = array(
    354                 'menu-item-db-id' => $menu_item_db_id,
    355                 'menu-item-object-id' => 0,
    356                 'menu-item-object' => '',
    357                 'menu-item-parent-id' => 0,
    358                 'menu-item-position' => 0,
    359                 'menu-item-type' => 'custom',
    360                 'menu-item-title' => '',
    361                 'menu-item-url' => '',
    362                 'menu-item-description' => '',
    363                 'menu-item-attr-title' => '',
    364                 'menu-item-target' => '',
    365                 'menu-item-classes' => '',
    366                 'menu-item-xfn' => '',
    367                 'menu-item-status' => '',
    368         );
     353        if ( 0 !== $menu_item_db_id ) {
     354                // Existing item; only changed properties will be updated.
     355                $item = get_post( $menu_item_db_id );
     356                $item = wp_setup_nav_menu_item( $item );
     357                $defaults = array(
     358                        'menu-item-db-id'       => $menu_item_db_id,
     359                        'menu-item-object-id'   => $item->object_id,
     360                        'menu-item-object'      => $item->object,
     361                        'menu-item-parent-id'   => $item->menu_item_parent,
     362                        'menu-item-position'    => $item->menu_order,
     363                        'menu-item-type'        => $item->type,
     364                        'menu-item-title'       => $item->title,
     365                        'menu-item-url'         => $item->url,
     366                        'menu-item-description' => $item->description,
     367                        'menu-item-attr-title'  => $item->attr_title,
     368                        'menu-item-target'      => $item->target,
     369                        'menu-item-classes'     => $item->classes,
     370                        'menu-item-xfn'         => $item->xfn,
     371                        'menu-item-status'      => $item->post_status,
     372                );
     373        } else {
     374                $defaults = array(
     375                        'menu-item-db-id'       => $menu_item_db_id,
     376                        'menu-item-object-id'   => 0,
     377                        'menu-item-object'      => '',
     378                        'menu-item-parent-id'   => 0,
     379                        'menu-item-position'    => 0,
     380                        'menu-item-type'        => 'custom',
     381                        'menu-item-title'       => '',
     382                        'menu-item-url'         => '',
     383                        'menu-item-description' => '',
     384                        'menu-item-attr-title'  => '',
     385                        'menu-item-target'      => '',
     386                        'menu-item-classes'     => '',
     387                        'menu-item-xfn'         => '',
     388                        'menu-item-status'      => '',
     389                );
     390        }
    369391
    370392        $args = wp_parse_args( $menu_item_data, $defaults );
    371393
     
    447469        update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($args['menu-item-object']) );
    448470        update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($args['menu-item-target']) );
    449471
    450         $args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) );
     472        if ( ! is_array( $args['menu-item-classes'] ) ) {
     473                $args['menu-item-classes'] = explode( ' ', $args['menu-item-classes'] );
     474        }
     475        $args['menu-item-classes'] = array_map( 'sanitize_html_class', $args['menu-item-classes'] );
    451476        $args['menu-item-xfn'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) );
    452477        update_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] );
    453478        update_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] );
  • tests/phpunit/tests/customize/nav-menu-item-setting.php

     
    622622                $this->assertEquals( 'deleted', $update_result['status'] );
    623623        }
    624624
     625        /**
     626         * Make sure an existing menu item is pre-populated with its existing values.
     627         *
     628         * @ticket 28138
     629         */
     630        function test_default_values() {
     631                do_action( 'customize_register', $this->wp_customize );
     632
     633                $first_post_id = $this->factory->post->create( array( 'post_title' => 'Hello World' ) );
     634
     635                $primary_menu_id = wp_create_nav_menu( 'Primary' );
     636                $item_title = 'Greetings';
     637                $item_id = wp_update_nav_menu_item( $primary_menu_id, 0, array(
     638                        'menu-item-type'        => 'post_type',
     639                        'menu-item-object'      => 'post',
     640                        'menu-item-object-id'   => $first_post_id,
     641                        'menu-item-title'       => $item_title,
     642                        'menu-item-status'      => 'publish',
     643                        'menu-item-parent-id'   => 1,
     644                        'menu-item-position'    => 1,
     645                        'menu-item-description' => 'This is a test',
     646                        'menu-item-attr-title'  => 'Attribute title',
     647                        'menu-item-target'      => '_blank',
     648                        'menu-item-classes'     => 'first second',
     649                        'menu-item-xfn'         => 'xfn',
     650                ) );
     651
     652                // Hook a mock action into the update action so we can capture arguments
     653                $a = new MockAction();
     654                add_action( 'wp_update_nav_menu_item', array( $a, 'action' ), 10, 3 );
     655
     656                // Now update the menu, passing no information, and verify that everything stayed the same
     657                $updated_id = wp_update_nav_menu_item( $primary_menu_id, $item_id, array() );
     658
     659                // Verify
     660                $this->assertEquals( 1, $a->get_call_count() );
     661
     662                $args = $a->get_args();
     663                $args = $args[0]; // There is only one item in the collection
     664                $this->assertEquals( $primary_menu_id, $args[0] );
     665                $this->assertEquals( $item_id, $args[1] );
     666
     667                $this->assertEquals( 'post_type',       $args[2]['menu-item-type'] );
     668                $this->assertEquals( 'post',            $args[2]['menu-item-object'] );
     669                $this->assertEquals( $first_post_id,    $args[2]['menu-item-object-id'] );
     670                $this->assertEquals( $item_title,       $args[2]['menu-item-title'] );
     671                $this->assertEquals( 'publish',         $args[2]['menu-item-status'] );
     672                $this->assertEquals( 1,                 $args[2]['menu-item-parent-id'] );
     673                $this->assertEquals( 1,                 $args[2]['menu-item-position'] );
     674                $this->assertEquals( 'This is a test',  $args[2]['menu-item-description'] );
     675                $this->assertEquals( 'Attribute title', $args[2]['menu-item-attr-title'] );
     676                $this->assertEquals( '_blank',          $args[2]['menu-item-target'] );
     677                $this->assertEquals( 'xfn',             $args[2]['menu-item-xfn'] );
     678
     679                $this->assertContains( 'first',  $args[2]['menu-item-classes'] );
     680                $this->assertContains( 'second', $args[2]['menu-item-classes'] );
     681        }
    625682}