WordPress.org

Make WordPress Core

Ticket #39692: 39692.diff

File 39692.diff, 3.7 KB (added by obenland, 14 months ago)

First pass at guessing menu locations

  • src/wp-includes/default-filters.php

     
    258258add_action( 'template_redirect',   'wp_shortlink_header',             11, 0 );
    259259add_action( 'wp_print_footer_scripts', '_wp_footer_scripts'                 );
    260260add_action( 'init',                'check_theme_switched',            99    );
     261add_action( 'after_switch_theme',  '_wp_menus_changed'                      );
    261262add_action( 'after_switch_theme',  '_wp_sidebars_changed'                   );
    262263add_action( 'wp_print_styles',     'print_emoji_styles'                     );
    263264
  • src/wp-includes/nav-menu.php

     
    978978                wp_update_nav_menu_item( $menu_id, 0, $args );
    979979        }
    980980}
     981
     982/**
     983 * Handle menu config after theme change
     984 *
     985 * @access private
     986 * @since 4.8.0
     987 */
     988function _wp_menus_changed() {
     989        $old_nav_menu_locations = get_option( 'theme_switch_menu_locations' );
     990        $new_nav_menu_locations = get_nav_menu_locations();
     991        $registered_nav_menus   = get_registered_nav_menus();
     992
     993        // If old and new theme have just one location, map it.
     994        if ( 1 === count( $old_nav_menu_locations ) && 1 === count( $registered_nav_menus ) ) {
     995                $new_nav_menu_locations[ key( $registered_nav_menus ) ] = array_pop( $old_nav_menu_locations );
     996        } else {
     997                $old_locations = array_keys( $old_nav_menu_locations );
     998
     999                // Map locations with the same slug.
     1000                foreach ( $registered_nav_menus as $location => $name ) {
     1001                        if ( in_array( $location, $old_locations ) ) {
     1002                                $new_nav_menu_locations[ $location ] = $old_nav_menu_locations[ $location ];
     1003                                unset( $old_nav_menu_locations[ $location ] );
     1004                        }
     1005                }
     1006
     1007                if ( ! empty( $old_nav_menu_locations ) ) {
     1008                        /*
     1009                         * If old and new theme both have locations that contain phrases
     1010                         * from within the same group, make an educated guess and map it.
     1011                         */
     1012                        $common_slug_groups = array(
     1013                                array( 'main', 'primary', 'navigation', 'top' ),
     1014                                array( 'secondary', 'footer', 'subsidiary', 'bottom' ),
     1015                                array( 'social' ),
     1016                        );
     1017
     1018                        foreach( $common_slug_groups as $slug_group ) {
     1019                                foreach( $old_nav_menu_locations as $location => $menu_id ) {
     1020                                        foreach ( $slug_group as $slug ) {
     1021                                                if ( strpos( $location, $slug ) || strpos( $slug, $location ) ) {
     1022                                                        foreach( $registered_nav_menus as $new_location => $name ) {
     1023                                                                if ( strpos( $new_location, $slug ) || strpos( $slug, $new_location ) ) {
     1024                                                                        $new_nav_menu_locations[ $new_location ] = $old_nav_menu_locations[ $location ];
     1025                                                                }
     1026                                                        }
     1027                                                }
     1028                                        }
     1029                                }
     1030                        }
     1031                }
     1032        }
     1033
     1034        set_theme_mod( 'nav_menu_locations', $new_nav_menu_locations );
     1035        delete_option( 'theme_switch_menu_locations' );
     1036}
  • src/wp-includes/theme.php

     
    690690        }
    691691
    692692        $nav_menu_locations = get_theme_mod( 'nav_menu_locations' );
     693        add_option( 'theme_switch_menu_locations', $nav_menu_locations );
    693694
    694695        if ( func_num_args() > 1 ) {
    695696                $stylesheet = func_get_arg( 1 );
     
    730731                if ( 'wp_ajax_customize_save' === current_action() ) {
    731732                        remove_theme_mod( 'sidebars_widgets' );
    732733                }
    733 
    734                 if ( ! empty( $nav_menu_locations ) ) {
    735                         $nav_mods = get_theme_mod( 'nav_menu_locations' );
    736                         if ( empty( $nav_mods ) ) {
    737                                 set_theme_mod( 'nav_menu_locations', $nav_menu_locations );
    738                         }
    739                 }
    740734        }
    741735
    742736        update_option( 'theme_switched', $old_theme->get_stylesheet() );