wp_nav_menu_update_menu_items( int|string $nav_menu_selected_id, string $nav_menu_selected_title )

Saves nav menu items


Parameters

$nav_menu_selected_id

(int|string) (Required) (id, slug, or name ) of the currently-selected menu

$nav_menu_selected_title

(string) (Required) Title of the currently-selected menu


Return

(array) $messages The menu updated message


Source

File: wp-admin/includes/nav-menu.php

function wp_nav_menu_update_menu_items ( $nav_menu_selected_id, $nav_menu_selected_title ) {
	$unsorted_menu_items = wp_get_nav_menu_items( $nav_menu_selected_id, array( 'orderby' => 'ID', 'output' => ARRAY_A, 'output_key' => 'ID', 'post_status' => 'draft,publish' ) );
	$messages = array();
	$menu_items = array();
	// Index menu items by db ID
	foreach ( $unsorted_menu_items as $_item )
		$menu_items[$_item->db_id] = $_item;

	$post_fields = array(
		'menu-item-db-id', 'menu-item-object-id', 'menu-item-object',
		'menu-item-parent-id', 'menu-item-position', 'menu-item-type',
		'menu-item-title', 'menu-item-url', 'menu-item-description',
		'menu-item-attr-title', 'menu-item-target', 'menu-item-classes', 'menu-item-xfn'
	);

	wp_defer_term_counting( true );
	// Loop through all the menu items' POST variables
	if ( ! empty( $_POST['menu-item-db-id'] ) ) {
		foreach ( (array) $_POST['menu-item-db-id'] as $_key => $k ) {

			// Menu item title can't be blank
			if ( ! isset( $_POST['menu-item-title'][ $_key ] ) || '' == $_POST['menu-item-title'][ $_key ] )
				continue;

			$args = array();
			foreach ( $post_fields as $field )
				$args[$field] = isset( $_POST[$field][$_key] ) ? $_POST[$field][$_key] : '';

			$menu_item_db_id = wp_update_nav_menu_item( $nav_menu_selected_id, ( $_POST['menu-item-db-id'][$_key] != $_key ? 0 : $_key ), $args );

			if ( is_wp_error( $menu_item_db_id ) ) {
				$messages[] = '<div id="message" class="error"><p>' . $menu_item_db_id->get_error_message() . '</p></div>';
			} else {
				unset( $menu_items[ $menu_item_db_id ] );
			}
		}
	}

	// Remove menu items from the menu that weren't in $_POST
	if ( ! empty( $menu_items ) ) {
		foreach ( array_keys( $menu_items ) as $menu_item_id ) {
			if ( is_nav_menu_item( $menu_item_id ) ) {
				wp_delete_post( $menu_item_id );
			}
		}
	}

	// Store 'auto-add' pages.
	$auto_add = ! empty( $_POST['auto-add-pages'] );
	$nav_menu_option = (array) get_option( 'nav_menu_options' );
	if ( ! isset( $nav_menu_option['auto_add'] ) )
		$nav_menu_option['auto_add'] = array();
	if ( $auto_add ) {
		if ( ! in_array( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) )
			$nav_menu_option['auto_add'][] = $nav_menu_selected_id;
	} else {
		if ( false !== ( $key = array_search( $nav_menu_selected_id, $nav_menu_option['auto_add'] ) ) )
			unset( $nav_menu_option['auto_add'][$key] );
	}
	// Remove nonexistent/deleted menus
	$nav_menu_option['auto_add'] = array_intersect( $nav_menu_option['auto_add'], wp_get_nav_menus( array( 'fields' => 'ids' ) ) );
	update_option( 'nav_menu_options', $nav_menu_option );

	wp_defer_term_counting( false );

	/** This action is documented in wp-includes/nav-menu.php */
	do_action( 'wp_update_nav_menu', $nav_menu_selected_id );

	$messages[] = '<div id="message" class="updated notice is-dismissible"><p>' .
		/* translators: %s: nav menu title */
		sprintf( __( '%s has been updated.' ),
			'<strong>' . $nav_menu_selected_title . '</strong>'
		) . '</p></div>';

	unset( $menu_items, $unsorted_menu_items );

	return $messages;
}


Changelog

Changelog
Version Description
WP-3.6.0 Introduced.