Make WordPress Core

Ticket #32760: 32760.diff

File 32760.diff, 6.2 KB (added by westonruter, 9 years ago)

https://github.com/xwp/wordpress-develop/pull/94

  • src/wp-admin/js/customize-nav-menus.js

    diff --git src/wp-admin/js/customize-nav-menus.js src/wp-admin/js/customize-nav-menus.js
    index e707e4d..4fab711 100644
     
    706706                },
    707707
    708708                populateControls: function() {
    709                         var section = this, menuNameControlId, menuControl, menuNameControl;
     709                        var section = this, setting, menuNameControlId, menuControl, menuNameControl;
     710
     711                        // Ensure menu name is always populated.
     712                        setting = api( section.id );
     713                        setting.validate = function( menu ) {
     714                                if ( menu && ! menu.name ) {
     715                                        menu.name = api.Menus.data.l10n.unnamed;
     716                                }
     717                                return menu;
     718                        };
     719                        setting.set( setting.validate( setting.get() ) );
    710720
    711721                        // Add the control for managing the menu name.
    712722                        menuNameControlId = section.id + '[name]';
     
    22062216                                {},
    22072217                                api.Menus.data.defaultSettingValues.nav_menu,
    22082218                                {
    2209                                         name: name
     2219                                        name: name || api.Menus.data.l10n.unnamed
    22102220                                }
    22112221                        ) );
    22122222
     
    22192229                                params: {
    22202230                                        id: customizeId,
    22212231                                        panel: 'nav_menus',
    2222                                         title: name,
     2232                                        title: api( customizeId ).get().name,
    22232233                                        customizeAction: api.Menus.data.l10n.customizingMenus,
    22242234                                        type: 'nav_menu',
    22252235                                        priority: 10,
     
    22992309                var insertedMenuIdMapping = {};
    23002310
    23012311                _( data.nav_menu_updates ).each(function( update ) {
    2302                         var oldCustomizeId, newCustomizeId, oldSetting, newSetting, settingValue, oldSection, newSection;
     2312                        var oldCustomizeId, newCustomizeId, customizeId, oldSetting, newSetting, setting, settingValue, oldSection, newSection, wasSaved;
    23032313                        if ( 'inserted' === update.status ) {
    23042314                                if ( ! update.previous_term_id ) {
    23052315                                        throw new Error( 'Expected previous_term_id' );
     
    23212331                                if ( ! settingValue ) {
    23222332                                        throw new Error( 'Did not expect setting to be empty (deleted).' );
    23232333                                }
    2324                                 settingValue = _.clone( settingValue );
     2334                                settingValue = $.extend( _.clone( settingValue ), update.saved_value );
    23252335
    23262336                                insertedMenuIdMapping[ update.previous_term_id ] = update.term_id;
    23272337                                newCustomizeId = 'nav_menu[' + String( update.term_id ) + ']';
     
    23792389                                }
    23802390
    23812391                                // @todo Update the Custom Menu selects, ensuring the newly-inserted IDs are used for any that have selected a placeholder menu.
     2392                        } else if ( 'updated' === update.status ) {
     2393                                customizeId = 'nav_menu[' + String( update.term_id ) + ']';
     2394                                if ( ! api.has( customizeId ) ) {
     2395                                        throw new Error( 'Expected setting to exist: ' + customizeId );
     2396                                }
     2397
     2398                                // Make sure the setting gets updated with its sanitized server value (specifically the conflict-resolved name).
     2399                                setting = api( customizeId );
     2400                                if ( ! _.isEqual( update.saved_value, setting.get() ) ) {
     2401                                        wasSaved = api.state( 'saved' ).get();
     2402                                        setting.set( update.saved_value );
     2403                                        setting._dirty = false;
     2404                                        api.state( 'saved' ).set( wasSaved );
     2405                                }
    23822406                        }
    23832407                } );
    23842408
  • src/wp-includes/class-wp-customize-nav-menus.php

    diff --git src/wp-includes/class-wp-customize-nav-menus.php src/wp-includes/class-wp-customize-nav-menus.php
    index 7fbbda8..a9aae0d 100644
    final class WP_Customize_Nav_Menus { 
    281281                        'itemTypes'            => $this->available_item_types(),
    282282                        'l10n'                 => array(
    283283                                'untitled'          => _x( '(no label)', 'missing menu item navigation label' ),
     284                                'unnamed'           => _x( '(unnamed)', 'Missing menu name.' ),
    284285                                'custom_label'      => __( 'Custom Link' ),
    285286                                /* translators: %s: Current menu location */
    286287                                'menuLocation'      => __( '(Currently set to: %s)' ),
  • src/wp-includes/class-wp-customize-setting.php

    diff --git src/wp-includes/class-wp-customize-setting.php src/wp-includes/class-wp-customize-setting.php
    index 5dd5293..3eb9824 100644
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    11821182                                if ( false === $nav_menu_setting->save() ) {
    11831183                                        $this->update_status = 'error';
    11841184                                        $this->update_error  = new WP_Error( 'nav_menu_setting_failure' );
     1185                                        return;
    11851186                                }
    11861187
    11871188                                if ( $nav_menu_setting->previous_term_id !== intval( $value['nav_menu_term_id'] ) ) {
    class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { 
    12071208                                if ( false === $parent_nav_menu_item_setting->save() ) {
    12081209                                        $this->update_status = 'error';
    12091210                                        $this->update_error  = new WP_Error( 'nav_menu_item_setting_failure' );
     1211                                        return;
    12101212                                }
    12111213
    12121214                                if ( $parent_nav_menu_item_setting->previous_post_id !== intval( $value['menu_item_parent'] ) ) {
    class WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting { 
    16061608                $value = array_merge( $default, $value );
    16071609                $value = wp_array_slice_assoc( $value, array_keys( $default ) );
    16081610
     1611                if ( '' === $value['name'] ) {
     1612                        $value['name'] = _x( '(unnamed)', 'Missing menu name.' );
     1613                }
     1614
    16091615                $value['name']        = trim( esc_html( $value['name'] ) ); // This sanitization code is used in wp-admin/nav-menus.php.
    16101616                $value['description'] = sanitize_text_field( $value['description'] );
    16111617                $value['parent']      = max( 0, intval( $value['parent'] ) );
    class WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting { 
    16731679                                $menu_data['menu-name'] = $value['name'];
    16741680                        }
    16751681
    1676                         $r = wp_update_nav_menu_object( $is_placeholder ? 0 : $this->term_id, $menu_data );
     1682                        $menu_id = $is_placeholder ? 0 : $this->term_id;
     1683                        $r = wp_update_nav_menu_object( $menu_id, $menu_data );
     1684                        $original_name = $menu_data['menu-name'];
     1685                        $name_conflict_suffix = 1;
     1686                        while ( is_wp_error( $r ) && 'menu_exists' === $r->get_error_code() ) {
     1687                                $name_conflict_suffix += 1;
     1688                                $menu_data['menu-name'] = sprintf( __( '%1$s (%2$d)' ), $original_name, $name_conflict_suffix );
     1689                                $r = wp_update_nav_menu_object( $menu_id, $menu_data );
     1690                        }
     1691
    16771692                        if ( is_wp_error( $r ) ) {
    16781693                                $this->update_status = 'error';
    16791694                                $this->update_error  = $r;
    class WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting { 
    17641779                        'previous_term_id' => $this->previous_term_id,
    17651780                        'error'            => $this->update_error ? $this->update_error->get_error_code() : null,
    17661781                        'status'           => $this->update_status,
     1782                        'saved_value'      => $this->value(),
    17671783                );
    17681784
    17691785                return $data;