wp_nav_menu_update_menu_items

The timeline below displays how wordpress function wp_nav_menu_update_menu_items has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.4

/**
 * Saves nav menu items.
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id    ID, slug, or name of the currently-selected menu.
 * @param string     $nav_menu_selected_title Title of the currently-selected menu.
 * @return string[] The menu updated messages.
 */
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, ((int) $_POST['menu-item-db-id'][$_key] !== $_key) ? 0 : $_key, $args);
            if (is_wp_error($menu_item_db_id)) {
                $messages[] = wp_get_admin_notice($menu_item_db_id->get_error_message(), array('id' => 'message', 'additional_classes' => array('error')));
            } 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'], true)) {
            $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
        }
    } else {
        $key = array_search($nav_menu_selected_id, $nav_menu_option['auto_add'], true);
        if (false !== $key) {
            unset($nav_menu_option['auto_add'][$key]);
        }
    }
    // Remove non-existent/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);
    /* translators: %s: Nav menu title. */
    $message = sprintf(__('%s has been updated.'), '<strong>' . $nav_menu_selected_title . '</strong>');
    $notice_args = array('id' => 'message', 'dismissible' => true, 'additional_classes' => array('updated'));
    $messages[] = wp_get_admin_notice($message, $notice_args);
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 6.3

/**
 * Saves nav menu items.
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id    ID, slug, or name of the currently-selected menu.
 * @param string     $nav_menu_selected_title Title of the currently-selected menu.
 * @return string[] The menu updated messages.
 */
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, ((int) $_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'], true)) {
            $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
        }
    } else {
        $key = array_search($nav_menu_selected_id, $nav_menu_option['auto_add'], true);
        if (false !== $key) {
            unset($nav_menu_option['auto_add'][$key]);
        }
    }
    // Remove non-existent/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>' . sprintf(
        /* translators: %s: Nav menu title. */
        __('%s has been updated.'),
        '<strong>' . $nav_menu_selected_title . '</strong>'
    ) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 6.2

/**
 * Saves nav menu items.
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id    ID, slug, or name of the currently-selected menu.
 * @param string     $nav_menu_selected_title Title of the currently-selected menu.
 * @return string[] The menu updated messages.
 */
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'], true)) {
            $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
        }
    } else {
        $key = array_search($nav_menu_selected_id, $nav_menu_option['auto_add'], true);
        if (false !== $key) {
            unset($nav_menu_option['auto_add'][$key]);
        }
    }
    // Remove non-existent/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>' . sprintf(
        /* translators: %s: Nav menu title. */
        __('%s has been updated.'),
        '<strong>' . $nav_menu_selected_title . '</strong>'
    ) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 5.5

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id    ID, slug, or name of the currently-selected menu.
 * @param string     $nav_menu_selected_title Title of the currently-selected menu.
 * @return array The menu updated message
 */
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'], true)) {
            $nav_menu_option['auto_add'][] = $nav_menu_selected_id;
        }
    } else {
        $key = array_search($nav_menu_selected_id, $nav_menu_option['auto_add'], true);
        if (false !== $key) {
            unset($nav_menu_option['auto_add'][$key]);
        }
    }
    // Remove non-existent/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>' . sprintf(
        /* translators: %s: Nav menu title. */
        __('%s has been updated.'),
        '<strong>' . $nav_menu_selected_title . '</strong>'
    ) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 5.4

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 * @return array The menu updated message
 */
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 {
        $key = array_search($nav_menu_selected_id, $nav_menu_option['auto_add']);
        if (false !== $key) {
            unset($nav_menu_option['auto_add'][$key]);
        }
    }
    // Remove non-existent/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>' . sprintf(
        /* translators: %s: Nav menu title. */
        __('%s has been updated.'),
        '<strong>' . $nav_menu_selected_title . '</strong>'
    ) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 5.3

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 * @return array $messages The menu updated message
 */
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 {
        $key = array_search($nav_menu_selected_id, $nav_menu_option['auto_add']);
        if (false !== $key) {
            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>' . sprintf(
        /* translators: %s: Nav menu title. */
        __('%s has been updated.'),
        '<strong>' . $nav_menu_selected_title . '</strong>'
    ) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 4.4

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 * @return array $messages The menu updated message
 */
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>' . sprintf(__('%s has been updated.'), '<strong>' . $nav_menu_selected_title . '</strong>') . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 4.3

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 * @return array $messages The menu updated message
 */
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>' . sprintf(__('<strong>%1$s</strong> has been updated.'), $nav_menu_selected_title) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 4.2

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 * @return array $messages The menu updated message
 */
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>';
            } elseif (isset($menu_items[$menu_item_db_id])) {
                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>' . sprintf(__('<strong>%1$s</strong> has been updated.'), $nav_menu_selected_title) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 4.1

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 * @return array $messages The menu updated message
 */
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'));
    $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>';
            } elseif (isset($menu_items[$menu_item_db_id])) {
                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"><p>' . sprintf(__('<strong>%1$s</strong> has been updated.'), $nav_menu_selected_title) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 3.8

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @uses wp_get_nav_menu_items() to retrieve the nav menu's menu items
 * @uses wp_defer_term_counter() to enable then disable term counting
 *
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 * @return array $messages The menu updated message
 */
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'));
    $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>';
            } elseif (isset($menu_items[$menu_item_db_id])) {
                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"><p>' . sprintf(__('<strong>%1$s</strong> has been updated.'), $nav_menu_selected_title) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}

WordPress Version: 3.7

/**
 * Saves nav menu items
 *
 * @since 3.6.0
 *
 * @uses wp_get_nav_menu_items() to retrieve the nav menu's menu items
 * @uses wp_defer_term_counter() to enable then disable term counting
 *
 * @param int|string $nav_menu_selected_id (id, slug, or name ) of the currently-selected menu
 * @param string $nav_menu_selected_title Title of the currently-selected menu
 * @return array $messages The menu updated message
 */
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'));
    $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>';
            } elseif (isset($menu_items[$menu_item_db_id])) {
                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);
    do_action('wp_update_nav_menu', $nav_menu_selected_id);
    $messages[] = '<div id="message" class="updated"><p>' . sprintf(__('<strong>%1$s</strong> has been updated.'), $nav_menu_selected_title) . '</p></div>';
    unset($menu_items, $unsorted_menu_items);
    return $messages;
}