WordPress.org

Make WordPress Core

Ticket #18527: duplicate-nav-menu.patch

File duplicate-nav-menu.patch, 4.7 KB (added by wpsmith, 3 years ago)
  • nav-menus.php

     
    268268                        unset( $_REQUEST['menu'] ); 
    269269                } 
    270270                break; 
     271        case 'duplicate': 
     272                //check_admin_referer( 'duplicate-nav_menu', 'duplicate-nav-menu-nonce' ); 
     273                 
     274                // Update menu theme locations 
     275                if ( isset( $_POST['menu-locations'] ) ) 
     276                        set_theme_mod( 'nav_menu_locations', array_map( 'absint', $_POST['menu-locations'] ) ); 
     277                 
     278                // capture current menu 
     279                if ( is_nav_menu( $nav_menu_selected_id ) ) { 
     280                        $duplicated_nav_menu_selected_id = $nav_menu_selected_id; 
     281                        $duplicated_nav_menu = wp_get_nav_menu_object( $nav_menu_selected_id ); 
     282                        $_menu_title = $duplicated_nav_menu->name.' (Copy)'; 
     283                } 
     284                 
     285                // create new menu 
     286                if ( $_menu_title ) { 
     287                        $_nav_menu_selected_id = wp_update_nav_menu_object( 0, array('menu-name' => $_menu_title) ); 
    271288 
     289                        if ( is_wp_error( $_nav_menu_selected_id ) ) { 
     290                                $messages[] = '<div id="message" class="error"><p>' . $_nav_menu_selected_id->get_error_message() . '</p></div>'; 
     291                        } else { 
     292                                $_menu_object = wp_get_nav_menu_object( $_nav_menu_selected_id ); 
     293                                $nav_menu_selected_id = $_nav_menu_selected_id; 
     294                                $nav_menu_selected_title = $_menu_object->name; 
     295                                $messages[] = '<div id="message" class="updated"><p>' . sprintf( __('The <strong>%s</strong> menu has been successfully created.'), $nav_menu_selected_title ) . '</p></div>'; 
     296                        } 
     297                } else { 
     298                        $messages[] = '<div id="message" class="error"><p>' . __('Please enter a valid menu name.') . '</p></div>'; 
     299                } 
     300                 
     301                // copy current menu into new menu  
     302                if ( ! is_wp_error( $_menu_object ) ) { 
     303                        $unsorted_menu_items = wp_get_nav_menu_items( $duplicated_nav_menu_selected_id, array('orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish') ); 
     304                        $menu_items = array(); 
     305                         
     306                        // Index menu items by db ID 
     307                        foreach( $unsorted_menu_items as $_item ) 
     308                                $menu_items[$_item->db_id] = $_item; 
     309 
     310                        $post_fields = array( 'db-id', 'object-id', 'object', 'parent-id', 'position', 'type', 'title', 'url', 'description', 'attr-title', 'target', 'classes', 'xfn' ); 
     311                        wp_defer_term_counting(true); 
     312 
     313                        // Loop through all the menu items' POST variables 
     314                        global $_nav_menu_placeholder; 
     315                        foreach( $menu_items as $_key => $k ) { 
     316                                $args = array(); 
     317                                foreach ( $post_fields as $field ) { 
     318                                 
     319                                        $_nav_menu_placeholder = ( 0 > $_nav_menu_placeholder ) ? intval($_nav_menu_placeholder) - 1 : -1; 
     320                                        $possible_object_id = $_nav_menu_placeholder; 
     321                                        $possible_db_id = ( ! empty( $k->ID ) ) && ( 0 < $possible_object_id ) ? (int) $k->ID : 0; 
     322                                 
     323                                        switch ( $field ) { 
     324                                                case 'db-id': 
     325                                                        //$args['menu-item-'.$field] = $k->db_id; 
     326                                                        $args['menu-item-'.$field] = $possible_db_id; 
     327                                                        break;  
     328                                                case 'object-id' : 
     329                                                        //$args['menu-item-'.$field] = $k->object_id; 
     330                                                        $args['menu-item-'.$field] = $possible_object_id; 
     331                                                        break;  
     332                                                case 'parent-id': 
     333                                                        $args['menu-item-'.$field] = $k->parent_id; 
     334                                                        break;  
     335                                                case 'attr-title' : 
     336                                                        $args['menu-item-'.$field] = $k->attr_title; 
     337                                                        break; 
     338                                                case 'classes' : 
     339                                                        $args['menu-item-'.$field] = implode( ' ' , $k->classes ); 
     340                                                        break; 
     341                                                default: 
     342                                                        $args['menu-item-'.$field] = $k->$field; 
     343                                                        break; 
     344                                        } 
     345                                } 
     346                                 
     347                                $menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, 0 , $args ); 
     348 
     349                                if ( is_wp_error( $menu_item_db_id ) ) 
     350                                        $messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>'; 
     351                                elseif ( isset( $menu_items[$menu_item_db_id] ) ) 
     352                                        unset( $menu_items[$menu_item_db_id] ); 
     353                        } 
     354                         
     355                } 
     356                 
     357                break; 
    272358        case 'update': 
    273359                check_admin_referer( 'update-nav_menu', 'update-nav-menu-nonce' ); 
    274360 
     
    560646                                                                        <a class="submitdelete deletion menu-delete" href="<?php echo esc_url( wp_nonce_url( admin_url('nav-menus.php?action=delete&amp;menu=' . $nav_menu_selected_id), 'delete-nav_menu-' . $nav_menu_selected_id ) ); ?>"><?php _e('Delete Menu'); ?></a> 
    561647                                                                </div><!-- END .delete-action --> 
    562648                                                                <?php endif; ?> 
     649                                                                <?php if ( ! empty( $nav_menu_selected_id ) ) : ?> 
     650                                                                <div class="duplicate-action"> 
     651                                                                        <a class="submitduplicate duplicate menu-duplicate" href="<?php echo esc_url( wp_nonce_url( admin_url('nav-menus.php?action=duplicate&amp;menu=' . $nav_menu_selected_id), 'duplicate-nav_menu-' . $nav_menu_selected_id ) ); ?>"><?php _e('Duplicate Menu'); ?></a> 
     652                                                                </div><!-- END .duplicate-action --> 
     653                                                                <?php endif; ?> 
    563654                                                        </div><!-- END .major-publishing-actions --> 
    564655                                                </div><!-- END #submitpost .submitbox --> 
    565656                                                <?php