Title: WP_Customize_Nav_Menu_Item_Setting::update
Published: August 18, 2015
Last modified: February 24, 2026

---

# WP_Customize_Nav_Menu_Item_Setting::update( array|false $value ): null|void

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#description)
    - [See also](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#see-also)
 * [Parameters](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#source)
 * [Related](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#changelog)

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

Creates/updates the nav_menu_item post for this setting.

## 󠀁[Description](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#description)󠁿

Any created menu items will have their assigned post IDs exported to the client 
via the [‘customize_save_response’](https://developer.wordpress.org/reference/hooks/customize_save_response/)
filter. Likewise, any errors will be exported to the client via the customize_save_response()
filter.

To delete a menu, the client can send false as the value.

### 󠀁[See also](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#see-also)󠁿

 * [wp_update_nav_menu_item()](https://developer.wordpress.org/reference/functions/wp_update_nav_menu_item/)

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

 `$value`array|falserequired

The menu item array to update. If false, then the menu item will be deleted entirely.
See WP_Customize_Nav_Menu_Item_Setting::$default for what the value should consist
of.

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

 null|void

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

    ```php
    protected function update( $value ) {
    	if ( $this->is_updated ) {
    		return;
    	}

    	$this->is_updated = true;
    	$is_placeholder   = ( $this->post_id < 0 );
    	$is_delete        = ( false === $value );

    	// Update the cached value.
    	$this->value = $value;

    	add_filter( 'customize_save_response', array( $this, 'amend_customize_save_response' ) );

    	if ( $is_delete ) {
    		// If the current setting post is a placeholder, a delete request is a no-op.
    		if ( $is_placeholder ) {
    			$this->update_status = 'deleted';
    		} else {
    			$r = wp_delete_post( $this->post_id, true );

    			if ( false === $r ) {
    				$this->update_error  = new WP_Error( 'delete_failure' );
    				$this->update_status = 'error';
    			} else {
    				$this->update_status = 'deleted';
    			}
    			// @todo send back the IDs for all associated nav menu items deleted, so these settings (and controls) can be removed from Customizer?
    		}
    	} else {

    		// Handle saving menu items for menus that are being newly-created.
    		if ( $value['nav_menu_term_id'] < 0 ) {
    			$nav_menu_setting_id = sprintf( 'nav_menu[%s]', $value['nav_menu_term_id'] );
    			$nav_menu_setting    = $this->manager->get_setting( $nav_menu_setting_id );

    			if ( ! $nav_menu_setting || ! ( $nav_menu_setting instanceof WP_Customize_Nav_Menu_Setting ) ) {
    				$this->update_status = 'error';
    				$this->update_error  = new WP_Error( 'unexpected_nav_menu_setting' );
    				return;
    			}

    			if ( false === $nav_menu_setting->save() ) {
    				$this->update_status = 'error';
    				$this->update_error  = new WP_Error( 'nav_menu_setting_failure' );
    				return;
    			}

    			if ( (int) $value['nav_menu_term_id'] !== $nav_menu_setting->previous_term_id ) {
    				$this->update_status = 'error';
    				$this->update_error  = new WP_Error( 'unexpected_previous_term_id' );
    				return;
    			}

    			$value['nav_menu_term_id'] = $nav_menu_setting->term_id;
    		}

    		// Handle saving a nav menu item that is a child of a nav menu item being newly-created.
    		if ( $value['menu_item_parent'] < 0 ) {
    			$parent_nav_menu_item_setting_id = sprintf( 'nav_menu_item[%s]', $value['menu_item_parent'] );
    			$parent_nav_menu_item_setting    = $this->manager->get_setting( $parent_nav_menu_item_setting_id );

    			if ( ! $parent_nav_menu_item_setting || ! ( $parent_nav_menu_item_setting instanceof WP_Customize_Nav_Menu_Item_Setting ) ) {
    				$this->update_status = 'error';
    				$this->update_error  = new WP_Error( 'unexpected_nav_menu_item_setting' );
    				return;
    			}

    			if ( false === $parent_nav_menu_item_setting->save() ) {
    				$this->update_status = 'error';
    				$this->update_error  = new WP_Error( 'nav_menu_item_setting_failure' );
    				return;
    			}

    			if ( (int) $value['menu_item_parent'] !== $parent_nav_menu_item_setting->previous_post_id ) {
    				$this->update_status = 'error';
    				$this->update_error  = new WP_Error( 'unexpected_previous_post_id' );
    				return;
    			}

    			$value['menu_item_parent'] = $parent_nav_menu_item_setting->post_id;
    		}

    		// Insert or update menu.
    		$menu_item_data = array(
    			'menu-item-object-id'   => $value['object_id'],
    			'menu-item-object'      => $value['object'],
    			'menu-item-parent-id'   => $value['menu_item_parent'],
    			'menu-item-position'    => $value['position'],
    			'menu-item-type'        => $value['type'],
    			'menu-item-title'       => $value['title'],
    			'menu-item-url'         => $value['url'],
    			'menu-item-description' => $value['description'],
    			'menu-item-attr-title'  => $value['attr_title'],
    			'menu-item-target'      => $value['target'],
    			'menu-item-classes'     => $value['classes'],
    			'menu-item-xfn'         => $value['xfn'],
    			'menu-item-status'      => $value['status'],
    		);

    		$r = wp_update_nav_menu_item(
    			$value['nav_menu_term_id'],
    			$is_placeholder ? 0 : $this->post_id,
    			wp_slash( $menu_item_data )
    		);

    		if ( is_wp_error( $r ) ) {
    			$this->update_status = 'error';
    			$this->update_error  = $r;
    		} else {
    			if ( $is_placeholder ) {
    				$this->previous_post_id = $this->post_id;
    				$this->post_id          = $r;
    				$this->update_status    = 'inserted';
    			} else {
    				$this->update_status = 'updated';
    			}
    		}
    	}
    }
    ```

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

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

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

Trashes or deletes a post or page.

  | 
| [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.

  | 
| [wp_slash()](https://developer.wordpress.org/reference/functions/wp_slash/)`wp-includes/formatting.php` |

Adds slashes to a string or recursively adds slashes to strings within an array.

  | 
| [add_filter()](https://developer.wordpress.org/reference/functions/add_filter/)`wp-includes/plugin.php` |

Adds a callback function to a filter hook.

  | 
| [is_wp_error()](https://developer.wordpress.org/reference/functions/is_wp_error/)`wp-includes/load.php` |

Checks whether the given variable is a WordPress Error.

  | 
| [WP_Error::__construct()](https://developer.wordpress.org/reference/classes/wp_error/__construct/)`wp-includes/class-wp-error.php` |

Initializes the error.

  |

[Show 4 more](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/classes/wp_customize_nav_menu_item_setting/update/?output_format=md#)

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

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

## User Contributed Notes

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