WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus( array $menus, array $args )

Filters the wp_get_nav_menus() result to ensure the inserted menu object is included, and the deleted one is removed.


Description

See also


Parameters

$menus

(Required) An array of menu objects.

$args

(Required) An array of arguments used to retrieve menu objects.


Return

(array)


Source

File: wp-includes/customize/class-wp-customize-nav-menu-setting.php

	public function filter_wp_get_nav_menus( $menus, $args ) {
		if ( get_current_blog_id() !== $this->_previewed_blog_id ) {
			return $menus;
		}

		$setting_value = $this->value();
		$is_delete = ( false === $setting_value );
		$index = -1;

		// Find the existing menu item's position in the list.
		foreach ( $menus as $i => $menu ) {
			if ( (int) $this->term_id === (int) $menu->term_id || (int) $this->previous_term_id === (int) $menu->term_id ) {
				$index = $i;
				break;
			}
		}

		if ( $is_delete ) {
			// Handle deleted menu by removing it from the list.
			if ( -1 !== $index ) {
				array_splice( $menus, $index, 1 );
			}
		} else {
			// Handle menus being updated or inserted.
			$menu_obj = (object) array_merge( array(
				'term_id'          => $this->term_id,
				'term_taxonomy_id' => $this->term_id,
				'slug'             => sanitize_title( $setting_value['name'] ),
				'count'            => 0,
				'term_group'       => 0,
				'taxonomy'         => self::TAXONOMY,
				'filter'           => 'raw',
			), $setting_value );

			array_splice( $menus, $index, ( -1 === $index ? 0 : 1 ), array( $menu_obj ) );
		}

		// Make sure the menu objects get re-sorted after an update/insert.
		if ( ! $is_delete && ! empty( $args['orderby'] ) ) {
			$menus = wp_list_sort( $menus, array(
				$args['orderby'] => 'ASC',
			) );
		}
		// @todo add support for $args['hide_empty'] === true

		return $menus;
	}


Changelog

Changelog
Version Description
WP-4.3.0 Introduced.