diff --git src/wp-admin/js/customize-nav-menus.js src/wp-admin/js/customize-nav-menus.js
index e707e4d..4fab711 100644
|
|
|
706 | 706 | }, |
707 | 707 | |
708 | 708 | 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() ) ); |
710 | 720 | |
711 | 721 | // Add the control for managing the menu name. |
712 | 722 | menuNameControlId = section.id + '[name]'; |
… |
… |
|
2206 | 2216 | {}, |
2207 | 2217 | api.Menus.data.defaultSettingValues.nav_menu, |
2208 | 2218 | { |
2209 | | name: name |
| 2219 | name: name || api.Menus.data.l10n.unnamed |
2210 | 2220 | } |
2211 | 2221 | ) ); |
2212 | 2222 | |
… |
… |
|
2219 | 2229 | params: { |
2220 | 2230 | id: customizeId, |
2221 | 2231 | panel: 'nav_menus', |
2222 | | title: name, |
| 2232 | title: api( customizeId ).get().name, |
2223 | 2233 | customizeAction: api.Menus.data.l10n.customizingMenus, |
2224 | 2234 | type: 'nav_menu', |
2225 | 2235 | priority: 10, |
… |
… |
|
2299 | 2309 | var insertedMenuIdMapping = {}; |
2300 | 2310 | |
2301 | 2311 | _( 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; |
2303 | 2313 | if ( 'inserted' === update.status ) { |
2304 | 2314 | if ( ! update.previous_term_id ) { |
2305 | 2315 | throw new Error( 'Expected previous_term_id' ); |
… |
… |
|
2321 | 2331 | if ( ! settingValue ) { |
2322 | 2332 | throw new Error( 'Did not expect setting to be empty (deleted).' ); |
2323 | 2333 | } |
2324 | | settingValue = _.clone( settingValue ); |
| 2334 | settingValue = $.extend( _.clone( settingValue ), update.saved_value ); |
2325 | 2335 | |
2326 | 2336 | insertedMenuIdMapping[ update.previous_term_id ] = update.term_id; |
2327 | 2337 | newCustomizeId = 'nav_menu[' + String( update.term_id ) + ']'; |
… |
… |
|
2379 | 2389 | } |
2380 | 2390 | |
2381 | 2391 | // @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 | } |
2382 | 2406 | } |
2383 | 2407 | } ); |
2384 | 2408 | |
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 { |
281 | 281 | 'itemTypes' => $this->available_item_types(), |
282 | 282 | 'l10n' => array( |
283 | 283 | 'untitled' => _x( '(no label)', 'missing menu item navigation label' ), |
| 284 | 'unnamed' => _x( '(unnamed)', 'Missing menu name.' ), |
284 | 285 | 'custom_label' => __( 'Custom Link' ), |
285 | 286 | /* translators: %s: Current menu location */ |
286 | 287 | 'menuLocation' => __( '(Currently set to: %s)' ), |
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 { |
1182 | 1182 | if ( false === $nav_menu_setting->save() ) { |
1183 | 1183 | $this->update_status = 'error'; |
1184 | 1184 | $this->update_error = new WP_Error( 'nav_menu_setting_failure' ); |
| 1185 | return; |
1185 | 1186 | } |
1186 | 1187 | |
1187 | 1188 | if ( $nav_menu_setting->previous_term_id !== intval( $value['nav_menu_term_id'] ) ) { |
… |
… |
class WP_Customize_Nav_Menu_Item_Setting extends WP_Customize_Setting { |
1207 | 1208 | if ( false === $parent_nav_menu_item_setting->save() ) { |
1208 | 1209 | $this->update_status = 'error'; |
1209 | 1210 | $this->update_error = new WP_Error( 'nav_menu_item_setting_failure' ); |
| 1211 | return; |
1210 | 1212 | } |
1211 | 1213 | |
1212 | 1214 | if ( $parent_nav_menu_item_setting->previous_post_id !== intval( $value['menu_item_parent'] ) ) { |
… |
… |
class WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting { |
1606 | 1608 | $value = array_merge( $default, $value ); |
1607 | 1609 | $value = wp_array_slice_assoc( $value, array_keys( $default ) ); |
1608 | 1610 | |
| 1611 | if ( '' === $value['name'] ) { |
| 1612 | $value['name'] = _x( '(unnamed)', 'Missing menu name.' ); |
| 1613 | } |
| 1614 | |
1609 | 1615 | $value['name'] = trim( esc_html( $value['name'] ) ); // This sanitization code is used in wp-admin/nav-menus.php. |
1610 | 1616 | $value['description'] = sanitize_text_field( $value['description'] ); |
1611 | 1617 | $value['parent'] = max( 0, intval( $value['parent'] ) ); |
… |
… |
class WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting { |
1673 | 1679 | $menu_data['menu-name'] = $value['name']; |
1674 | 1680 | } |
1675 | 1681 | |
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 | |
1677 | 1692 | if ( is_wp_error( $r ) ) { |
1678 | 1693 | $this->update_status = 'error'; |
1679 | 1694 | $this->update_error = $r; |
… |
… |
class WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting { |
1764 | 1779 | 'previous_term_id' => $this->previous_term_id, |
1765 | 1780 | 'error' => $this->update_error ? $this->update_error->get_error_code() : null, |
1766 | 1781 | 'status' => $this->update_status, |
| 1782 | 'saved_value' => $this->value(), |
1767 | 1783 | ); |
1768 | 1784 | |
1769 | 1785 | return $data; |