Title: wp_save_nav_menu_items
Published: April 25, 2014
Last modified: February 24, 2026

---

# wp_save_nav_menu_items( int $menu_id, array[] $menu_data = array() ): int[]

## In this article

 * [Parameters](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#source)
 * [Related](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#wp--skip-link--target)

Save posted nav menu item data.

## 󠀁[Parameters](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#parameters)󠁿

 `$menu_id`intrequired

The menu ID for which to save this item. Value of 0 makes a draft, orphaned menu
item. Default 0.

`$menu_data`array[]optional

The unsanitized POSTed menu item data.

Default:`array()`

## 󠀁[Return](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#return)󠁿

 int[] The database IDs of the items saved

## 󠀁[Source](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#source)󠁿

    ```php
    function wp_save_nav_menu_items( $menu_id = 0, $menu_data = array() ) {
    	$menu_id     = (int) $menu_id;
    	$items_saved = array();

    	if ( 0 === $menu_id || is_nav_menu( $menu_id ) ) {

    		// Loop through all the menu items' POST values.
    		foreach ( (array) $menu_data as $_possible_db_id => $_item_object_data ) {
    			if (
    				// Checkbox is not checked.
    				empty( $_item_object_data['menu-item-object-id'] ) &&
    				(
    					// And item type either isn't set.
    					! isset( $_item_object_data['menu-item-type'] ) ||
    					// Or URL is the default.
    					in_array( $_item_object_data['menu-item-url'], array( 'https://', 'http://', '' ), true ) ||
    					// Or it's not a custom menu item (but not the custom home page).
    					! ( 'custom' === $_item_object_data['menu-item-type'] && ! isset( $_item_object_data['menu-item-db-id'] ) ) ||
    					// Or it *is* a custom menu item that already exists.
    					! empty( $_item_object_data['menu-item-db-id'] )
    				)
    			) {
    				// Then this potential menu item is not getting added to this menu.
    				continue;
    			}

    			// If this possible menu item doesn't actually have a menu database ID yet.
    			if (
    				empty( $_item_object_data['menu-item-db-id'] ) ||
    				( 0 > $_possible_db_id ) ||
    				$_possible_db_id !== (int) $_item_object_data['menu-item-db-id']
    			) {
    				$_actual_db_id = 0;
    			} else {
    				$_actual_db_id = (int) $_item_object_data['menu-item-db-id'];
    			}

    			$args = array(
    				'menu-item-db-id'       => ( isset( $_item_object_data['menu-item-db-id'] ) ? $_item_object_data['menu-item-db-id'] : '' ),
    				'menu-item-object-id'   => ( isset( $_item_object_data['menu-item-object-id'] ) ? $_item_object_data['menu-item-object-id'] : '' ),
    				'menu-item-object'      => ( isset( $_item_object_data['menu-item-object'] ) ? $_item_object_data['menu-item-object'] : '' ),
    				'menu-item-parent-id'   => ( isset( $_item_object_data['menu-item-parent-id'] ) ? $_item_object_data['menu-item-parent-id'] : '' ),
    				'menu-item-position'    => ( isset( $_item_object_data['menu-item-position'] ) ? $_item_object_data['menu-item-position'] : '' ),
    				'menu-item-type'        => ( isset( $_item_object_data['menu-item-type'] ) ? $_item_object_data['menu-item-type'] : '' ),
    				'menu-item-title'       => ( isset( $_item_object_data['menu-item-title'] ) ? $_item_object_data['menu-item-title'] : '' ),
    				'menu-item-url'         => ( isset( $_item_object_data['menu-item-url'] ) ? $_item_object_data['menu-item-url'] : '' ),
    				'menu-item-description' => ( isset( $_item_object_data['menu-item-description'] ) ? $_item_object_data['menu-item-description'] : '' ),
    				'menu-item-attr-title'  => ( isset( $_item_object_data['menu-item-attr-title'] ) ? $_item_object_data['menu-item-attr-title'] : '' ),
    				'menu-item-target'      => ( isset( $_item_object_data['menu-item-target'] ) ? $_item_object_data['menu-item-target'] : '' ),
    				'menu-item-classes'     => ( isset( $_item_object_data['menu-item-classes'] ) ? $_item_object_data['menu-item-classes'] : '' ),
    				'menu-item-xfn'         => ( isset( $_item_object_data['menu-item-xfn'] ) ? $_item_object_data['menu-item-xfn'] : '' ),
    			);

    			$items_saved[] = wp_update_nav_menu_item( $menu_id, $_actual_db_id, $args );

    		}
    	}

    	return $items_saved;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-admin/includes/nav-menu.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-admin/includes/nav-menu.php#L1148)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-admin/includes/nav-menu.php#L1148-L1207)

## 󠀁[Related](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#related)󠁿

| Uses | Description | 
| [wp_update_nav_menu_item()](https://developer.wordpress.org/reference/functions/wp_update_nav_menu_item/)`wp-includes/nav-menu.php` |

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

  | 
| [is_nav_menu()](https://developer.wordpress.org/reference/functions/is_nav_menu/)`wp-includes/nav-menu.php` |

Determines whether the given ID is a navigation menu.

  |

| Used by | Description | 
| [wp_ajax_add_menu_item()](https://developer.wordpress.org/reference/functions/wp_ajax_add_menu_item/)`wp-admin/includes/ajax-actions.php` |

Handles adding a menu item via AJAX.

  |

## 󠀁[Changelog](https://developer.wordpress.org/reference/functions/wp_save_nav_menu_items/?output_format=md#changelog)󠁿

| Version | Description | 
| [3.0.0](https://developer.wordpress.org/reference/since/3.0.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Ffunctions%2Fwp_save_nav_menu_items%2F)
before being able to contribute a note or feedback.