WordPress.org

Make WordPress Core

Ticket #39692: 39692.diff

File 39692.diff, 3.7 KB (added by obenland, 10 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() );