WordPress.org

Make WordPress Core

Ticket #18527: duplicate-nav-menu.patch

File duplicate-nav-menu.patch, 4.7 KB (added by wpsmith, 7 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