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;
}