From 619f0b4b342dfb811e669c6092b9ee9e429730d3 Mon Sep 17 00:00:00 2001 From: Konstantin Obenland Date: Tue, 24 Oct 2017 18:34:21 +0000 Subject: [PATCH] Customize: Allow previewed menus to be customized Fixes a bug where menu assignements couldn't be changed when previewing a theme. Also removes an unnecessary call to menu mapping after a theme switch from the customizer and makes sure the locations option is always written, for good measure. Props westonruter. See #39692. git-svn-id: https://develop.svn.wordpress.org/trunk@41995 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-customize-nav-menus.php | 5 +++-- src/wp-includes/theme.php | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/class-wp-customize-nav-menus.php b/src/wp-includes/class-wp-customize-nav-menus.php index 87e95009a3..d178de3e24 100644 --- a/src/wp-includes/class-wp-customize-nav-menus.php +++ b/src/wp-includes/class-wp-customize-nav-menus.php @@ -529,10 +529,11 @@ final class WP_Customize_Nav_Menus { * @since 4.3.0 */ public function customize_register() { + $changeset = $this->manager->unsanitized_post_values(); // 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 ) { + foreach ( array_keys( $changeset ) as $setting_id ) { if ( preg_match( '/^(nav_menu_locations|nav_menu|nav_menu_item)\[/', $setting_id ) ) { $nav_menus_setting_ids[] = $setting_id; } @@ -627,7 +628,7 @@ final class WP_Customize_Nav_Menus { } // Override the assigned nav menu location if mapped during previewed theme switch. - if ( isset( $mapped_nav_menu_locations[ $location ] ) ) { + if ( empty( $changeset[ $setting_id ] ) && isset( $mapped_nav_menu_locations[ $location ] ) ) { $this->manager->set_post_value( $setting_id, $mapped_nav_menu_locations[ $location ] ); } diff --git a/src/wp-includes/theme.php b/src/wp-includes/theme.php index a69f4830cc..4e5f63bb8e 100644 --- a/src/wp-includes/theme.php +++ b/src/wp-includes/theme.php @@ -694,7 +694,7 @@ function switch_theme( $stylesheet ) { } $nav_menu_locations = get_theme_mod( 'nav_menu_locations' ); - add_option( 'theme_switch_menu_locations', $nav_menu_locations ); + update_option( 'theme_switch_menu_locations', $nav_menu_locations ); if ( func_num_args() > 1 ) { $stylesheet = func_get_arg( 1 ); @@ -2724,8 +2724,9 @@ function check_theme_switched() { if ( $stylesheet = get_option( 'theme_switched' ) ) { $old_theme = wp_get_theme( $stylesheet ); - // Prevent retrieve_widgets() from running since Customizer already called it up front + // Prevent widget & menu mapping from running since Customizer already called it up front if ( get_option( 'theme_switched_via_customizer' ) ) { + remove_action( 'after_switch_theme', '_wp_menus_changed' ); remove_action( 'after_switch_theme', '_wp_sidebars_changed' ); update_option( 'theme_switched_via_customizer', false ); }