From ce5e63c224fd7b192556e16ea2b09ebf43360765 Mon Sep 17 00:00:00 2001 From: Dion Hulse Date: Mon, 12 Dec 2016 01:56:53 +0000 Subject: [PATCH] Customize: Fix inability to delete nav menus by preventing `preview` filters from being added during `customize_save` admin ajax request. Also prevent setting `nav_menu_locations[...]` values to `NaN` which gets sent as `null`. Props westonruter. See #30937, [38810]. Merges [39558] to the 4.7 branch. Fixes #39103. git-svn-id: https://develop.svn.wordpress.org/branches/4.7@39570 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/js/customize-nav-menus.js | 6 +++++- src/wp-includes/class-wp-customize-nav-menus.php | 15 +++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/wp-admin/js/customize-nav-menus.js b/src/wp-admin/js/customize-nav-menus.js index b7556f6702..a37d2c4e79 100644 --- a/src/wp-admin/js/customize-nav-menus.js +++ b/src/wp-admin/js/customize-nav-menus.js @@ -1169,7 +1169,11 @@ // @todo It would be better if this was added directly on the setting itself, as opposed to the control. control.setting.validate = function( value ) { - return parseInt( value, 10 ); + if ( '' === value ) { + return 0; + } else { + return parseInt( value, 10 ); + } }; // Edit menu button. diff --git a/src/wp-includes/class-wp-customize-nav-menus.php b/src/wp-includes/class-wp-customize-nav-menus.php index ca1b72f7eb..49c92198fa 100644 --- a/src/wp-includes/class-wp-customize-nav-menus.php +++ b/src/wp-includes/class-wp-customize-nav-menus.php @@ -531,10 +531,7 @@ final class WP_Customize_Nav_Menus { */ public function customize_register() { - /* - * Preview settings for nav menus early so that the sections and controls will be added properly. - * See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L506-L543 - */ + // Preview settings for nav menus early so that the sections and controls will be added properly. $nav_menus_setting_ids = array(); foreach ( array_keys( $this->manager->unsanitized_post_values() ) as $setting_id ) { if ( preg_match( '/^(nav_menu_locations|nav_menu|nav_menu_item)\[/', $setting_id ) ) { @@ -542,10 +539,12 @@ final class WP_Customize_Nav_Menus { } } $this->manager->add_dynamic_settings( $nav_menus_setting_ids ); - foreach ( $nav_menus_setting_ids as $setting_id ) { - $setting = $this->manager->get_setting( $setting_id ); - if ( $setting ) { - $setting->preview(); + if ( ! $this->manager->doing_ajax( 'customize_save' ) ) { + foreach ( $nav_menus_setting_ids as $setting_id ) { + $setting = $this->manager->get_setting( $setting_id ); + if ( $setting ) { + $setting->preview(); + } } }