wp_update_nav_menu_item() – Saves the properties of a menu item or create a new one.

You appear to be a bot. Output may be restricted

Description

Saves the properties of a menu item or create a new one.

The menu-item-title, menu-item-description and menu-item-attr-title are expected to be pre-slashed since they are passed directly to APIs that expect slashed data.

Usage

$int|WP_Error = wp_update_nav_menu_item( $menu_id, $menu_item_db_id, $menu_item_data, $fire_after_hooks );

Parameters

$menu_id
( int ) optional – The ID of the menu. If 0, makes the menu item a draft orphan.
$menu_item_db_id
( int ) optional – The ID of the menu item. If 0, creates a new menu item.
$menu_item_data
( array ) optional – The menu item's data.
$fire_after_hooks
( bool ) optional default: 1 – Whether to fire the after insert hooks. Default true.

Returns

int|WP_Error The menu item's database ID or WP_Error object on failure.

Source

File name: wordpress/wp-includes/nav-menu.php
Lines:

1 to 100 of 196
function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array(), $fire_after_hooks = true ) {
  $menu_id         = (int) $menu_id;
  $menu_item_db_id = (int) $menu_item_db_id;

  // Make sure that we don't convert non-nav_menu_item objects into nav_menu_item objects.
  if ( ! empty( $menu_item_db_id ) && ! is_nav_menu_item( $menu_item_db_id ) ) {
    return new WP_Error( 'update_nav_menu_item_failed', __( 'The given object ID is not that of a menu item.' ) );
  }

  $menu = wp_get_nav_menu_object( $menu_id );

  if ( ! $menu && 0 !== $menu_id ) {
    return new WP_Error( 'invalid_menu_id', __( 'Invalid menu ID.' ) );
  }

  if ( is_wp_error( $menu ) ) {
    return $menu;
  }

  $defaults = array(
    'menu-item-db-id'         => $menu_item_db_id,
    'menu-item-object-id'     => 0,
    'menu-item-object'        => '',
    'menu-item-parent-id'     => 0,
    'menu-item-position'      => 0,
    'menu-item-type'          => 'custom',
    'menu-item-title'         => '',
    'menu-item-url'           => '',
    'menu-item-description'   => '',
    'menu-item-attr-title'    => '',
    'menu-item-target'        => '',
    'menu-item-classes'       => '',
    'menu-item-xfn'           => '',
    'menu-item-status'        => '',
    'menu-item-post-date'     => '',
    'menu-item-post-date-gmt' => '',
  );

  $args = wp_parse_args( $menu_item_data, $defaults );

  if ( 0 == $menu_id ) {
    $args['menu-item-position'] = 1;
  } elseif ( 0 == (int) $args['menu-item-position'] ) {
    $menu_items                 = 0 == $menu_id ? array() : (array) wp_get_nav_menu_items( $menu_id, array( 'post_status' => 'publish,draft' ) );
    $last_item                  = array_pop( $menu_items );
    $args['menu-item-position'] = ( $last_item && isset( $last_item->menu_order ) ) ? 1 + $last_item->menu_order : count( $menu_items );
  }

  $original_parent = 0 < $menu_item_db_id ? get_post_field( 'post_parent', $menu_item_db_id ) : 0;

  if ( 'custom' === $args['menu-item-type'] ) {
    // If custom menu item, trim the URL.
    $args['menu-item-url'] = trim( $args['menu-item-url'] );
  } else {
    /*
		 * If non-custom menu item, then:
		 * - use the original object's URL.
		 * - blank default title to sync with the original object's title.
		 */

    $args['menu-item-url'] = '';

    $original_title = '';
    if ( 'taxonomy' === $args['menu-item-type'] ) {
      $original_parent = get_term_field( 'parent', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' );
      $original_title  = get_term_field( 'name', $args['menu-item-object-id'], $args['menu-item-object'], 'raw' );
    } elseif ( 'post_type' === $args['menu-item-type'] ) {

      $original_object = get_post( $args['menu-item-object-id'] );
      $original_parent = (int) $original_object->post_parent;
      $original_title  = $original_object->post_title;
    } elseif ( 'post_type_archive' === $args['menu-item-type'] ) {
      $original_object = get_post_type_object( $args['menu-item-object'] );
      if ( $original_object ) {
        $original_title = $original_object->labels->archives;
      }
    }

    if ( wp_unslash( $args['menu-item-title'] ) === wp_specialchars_decode( $original_title ) ) {
      $args['menu-item-title'] = '';
    }

    // Hack to get wp to create a post object when too many properties are empty.
    if ( '' === $args['menu-item-title'] && '' === $args['menu-item-description'] ) {
      $args['menu-item-description'] = ' ';
    }
  }

  // Populate the menu item object.
  $post = array(
    'menu_order'   => $args['menu-item-position'],
    'ping_status'  => 0,
    'post_content' => $args['menu-item-description'],
    'post_excerpt' => $args['menu-item-attr-title'],
    'post_parent'  => $original_parent,
    'post_title'   => $args['menu-item-title'],
    'post_type'    => 'nav_menu_item',
  );

  $post_date = wp_resolve_post_date( $args['menu-item-post-date'], $args['menu-item-post-date-gmt'] );
 

 View on GitHub View on Trac