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.

Built from https://develop.svn.wordpress.org/trunk@41995


git-svn-id: http://core.svn.wordpress.org/trunk@41829 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Konstantin Obenland 2017-10-24 18:35:48 +00:00
parent 7e689f541d
commit 5aa45cd12e
3 changed files with 7 additions and 5 deletions

View File

@ -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 ] );
}

View File

@ -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 );
}

View File

@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
$wp_version = '4.9-beta3-41994';
$wp_version = '4.9-beta3-41995';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.