303 $args = wp_parse_args( $menu_item_data, $defaults ); |
299 $args = wp_parse_args( $menu_item_data, $defaults ); |
304 |
300 |
305 if ( 0 == $menu_id ) { |
301 if ( 0 == $menu_id ) { |
306 $args['menu-item-position'] = 1; |
302 $args['menu-item-position'] = 1; |
307 } elseif ( 0 == (int) $args['menu-item-position'] ) { |
303 } elseif ( 0 == (int) $args['menu-item-position'] ) { |
|
304 $menu_items = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) ); |
308 $last_item = array_pop( $menu_items ); |
305 $last_item = array_pop( $menu_items ); |
309 $args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : $count; |
306 $args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : count( $menu_items ); |
310 } |
307 } |
311 |
308 |
312 $original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0; |
309 $original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0; |
313 |
310 |
314 if ( 'custom' != $args['menu-item-type'] ) { |
311 if ( 'custom' != $args['menu-item-type'] ) { |
348 'post_parent' => $original_parent, |
345 'post_parent' => $original_parent, |
349 'post_title' => $args['menu-item-title'], |
346 'post_title' => $args['menu-item-title'], |
350 'post_type' => 'nav_menu_item', |
347 'post_type' => 'nav_menu_item', |
351 ); |
348 ); |
352 |
349 |
353 if ( 0 != $menu_id ) |
350 $update = 0 != $menu_item_db_id; |
|
351 |
|
352 // Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms() |
|
353 if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) ) |
354 $post['tax_input'] = array( 'nav_menu' => array( intval( $menu->term_id ) ) ); |
354 $post['tax_input'] = array( 'nav_menu' => array( intval( $menu->term_id ) ) ); |
355 |
355 |
356 // New menu item. Default is draft status |
356 // New menu item. Default is draft status |
357 if ( 0 == $menu_item_db_id ) { |
357 if ( ! $update ) { |
358 $post['ID'] = 0; |
358 $post['ID'] = 0; |
359 $post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft'; |
359 $post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft'; |
360 $menu_item_db_id = wp_insert_post( $post ); |
360 $menu_item_db_id = wp_insert_post( $post ); |
361 |
361 if ( ! $menu_item_db_id || is_wp_error( $menu_item_db_id ) ) |
362 // Update existing menu item. Default is publish status |
362 return $menu_item_db_id; |
363 } else { |
|
364 $post['ID'] = $menu_item_db_id; |
|
365 $post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish'; |
|
366 wp_update_post( $post ); |
|
367 } |
363 } |
368 |
364 |
369 if ( 'custom' == $args['menu-item-type'] ) { |
365 if ( 'custom' == $args['menu-item-type'] ) { |
370 $args['menu-item-object-id'] = $menu_item_db_id; |
366 $args['menu-item-object-id'] = $menu_item_db_id; |
371 $args['menu-item-object'] = 'custom'; |
367 $args['menu-item-object'] = 'custom'; |
372 } |
368 } |
373 |
369 |
374 if ( ! $menu_item_db_id || is_wp_error( $menu_item_db_id ) ) |
|
375 return $menu_item_db_id; |
|
376 |
|
377 $menu_item_db_id = (int) $menu_item_db_id; |
370 $menu_item_db_id = (int) $menu_item_db_id; |
378 |
371 |
379 update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($args['menu-item-type']) ); |
372 update_post_meta( $menu_item_db_id, '_menu_item_type', sanitize_key($args['menu-item-type']) ); |
380 update_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', (int) $args['menu-item-parent-id'] ); |
373 update_post_meta( $menu_item_db_id, '_menu_item_menu_item_parent', strval( (int) $args['menu-item-parent-id'] ) ); |
381 update_post_meta( $menu_item_db_id, '_menu_item_object_id', (int) $args['menu-item-object-id'] ); |
374 update_post_meta( $menu_item_db_id, '_menu_item_object_id', strval( (int) $args['menu-item-object-id'] ) ); |
382 update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($args['menu-item-object']) ); |
375 update_post_meta( $menu_item_db_id, '_menu_item_object', sanitize_key($args['menu-item-object']) ); |
383 update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($args['menu-item-target']) ); |
376 update_post_meta( $menu_item_db_id, '_menu_item_target', sanitize_key($args['menu-item-target']) ); |
384 |
377 |
385 $args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) ); |
378 $args['menu-item-classes'] = array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-classes'] ) ); |
386 $args['menu-item-xfn'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) ); |
379 $args['menu-item-xfn'] = implode( ' ', array_map( 'sanitize_html_class', explode( ' ', $args['menu-item-xfn'] ) ) ); |
387 update_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] ); |
380 update_post_meta( $menu_item_db_id, '_menu_item_classes', $args['menu-item-classes'] ); |
388 update_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] ); |
381 update_post_meta( $menu_item_db_id, '_menu_item_xfn', $args['menu-item-xfn'] ); |
389 update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($args['menu-item-url']) ); |
382 update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($args['menu-item-url']) ); |
390 |
383 |
391 if ( 0 == $menu_id ) |
384 if ( 0 == $menu_id ) |
392 update_post_meta( $menu_item_db_id, '_menu_item_orphaned', time() ); |
385 update_post_meta( $menu_item_db_id, '_menu_item_orphaned', (string) time() ); |
393 else |
386 elseif ( get_post_meta( $menu_item_db_id, '_menu_item_orphaned' ) ) |
394 delete_post_meta( $menu_item_db_id, '_menu_item_orphaned' ); |
387 delete_post_meta( $menu_item_db_id, '_menu_item_orphaned' ); |
|
388 |
|
389 // Update existing menu item. Default is publish status |
|
390 if ( $update ) { |
|
391 $post['ID'] = $menu_item_db_id; |
|
392 $post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish'; |
|
393 wp_update_post( $post ); |
|
394 } |
395 |
395 |
396 do_action('wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args ); |
396 do_action('wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args ); |
397 |
397 |
398 return $menu_item_db_id; |
398 return $menu_item_db_id; |
399 } |
399 } |
481 |
481 |
482 if ( empty( $items ) ) |
482 if ( empty( $items ) ) |
483 return $items; |
483 return $items; |
484 |
484 |
485 $defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item', |
485 $defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item', |
486 'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true, |
486 'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true ); |
487 'update_post_term_cache' => false ); |
|
488 $args = wp_parse_args( $args, $defaults ); |
487 $args = wp_parse_args( $args, $defaults ); |
489 if ( count( $items ) > 1 ) |
488 if ( count( $items ) > 1 ) |
490 $args['include'] = implode( ',', $items ); |
489 $args['include'] = implode( ',', $items ); |
491 else |
490 else |
492 $args['include'] = $items[0]; |
491 $args['include'] = $items[0]; |