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