wp/wp-includes/nav-menu.php
changeset 5 5e2f62d02dcd
parent 0 d970ebf37754
child 7 cf61fcea0001
equal deleted inserted replaced
4:346c88efed21 5:5e2f62d02dcd
    10 /**
    10 /**
    11  * Returns a navigation menu object.
    11  * Returns a navigation menu object.
    12  *
    12  *
    13  * @since 3.0.0
    13  * @since 3.0.0
    14  *
    14  *
    15  * @uses get_term
    15  * @param string $menu Menu ID, slug, or name.
    16  * @uses get_term_by
       
    17  *
       
    18  * @param string $menu Menu id, slug or name
       
    19  * @return mixed false if $menu param isn't supplied or term does not exist, menu object if successful.
    16  * @return mixed false if $menu param isn't supplied or term does not exist, menu object if successful.
    20  */
    17  */
    21 function wp_get_nav_menu_object( $menu ) {
    18 function wp_get_nav_menu_object( $menu ) {
    22 	if ( ! $menu )
    19 	if ( ! $menu )
    23 		return false;
    20 		return false;
    41  *
    38  *
    42  * Returns true if it is; false otherwise.
    39  * Returns true if it is; false otherwise.
    43  *
    40  *
    44  * @since 3.0.0
    41  * @since 3.0.0
    45  *
    42  *
    46  * @param int|string $menu The menu to check (id, slug, or name)
    43  * @param int|string $menu The menu to check (ID, slug, or name).
    47  * @return bool Whether the menu exists.
    44  * @return bool Whether the menu exists.
    48  */
    45  */
    49 function is_nav_menu( $menu ) {
    46 function is_nav_menu( $menu ) {
    50 	if ( ! $menu )
    47 	if ( ! $menu )
    51 		return false;
    48 		return false;
    79 }
    76 }
    80 
    77 
    81 /**
    78 /**
    82  * Unregisters a navigation menu for a theme.
    79  * Unregisters a navigation menu for a theme.
    83  *
    80  *
    84  * @param array $location the menu location identifier
    81  * @param string $location The menu location identifier.
    85  *
       
    86  * @return bool True on success, false on failure.
    82  * @return bool True on success, false on failure.
    87  */
    83  */
    88 function unregister_nav_menu( $location ) {
    84 function unregister_nav_menu( $location ) {
    89 	global $_wp_registered_nav_menus;
    85 	global $_wp_registered_nav_menus;
    90 
    86 
    91 	if ( is_array( $_wp_registered_nav_menus ) && isset( $_wp_registered_nav_menus[$location] ) ) {
    87 	if ( is_array( $_wp_registered_nav_menus ) && isset( $_wp_registered_nav_menus[$location] ) ) {
    92 		unset( $_wp_registered_nav_menus[$location] );
    88 		unset( $_wp_registered_nav_menus[$location] );
       
    89 		if ( empty( $_wp_registered_nav_menus ) ) {
       
    90 			_remove_theme_support( 'menus' );
       
    91 		}
    93 		return true;
    92 		return true;
    94 	}
    93 	}
    95 	return false;
    94 	return false;
    96 }
    95 }
    97 
    96 
   137  * @since 3.0.0
   136  * @since 3.0.0
   138  * @param string $location Menu location identifier.
   137  * @param string $location Menu location identifier.
   139  * @return bool Whether location has a menu.
   138  * @return bool Whether location has a menu.
   140  */
   139  */
   141 function has_nav_menu( $location ) {
   140 function has_nav_menu( $location ) {
       
   141 	$registered_nav_menus = get_registered_nav_menus();
       
   142 	if ( ! isset( $registered_nav_menus[ $location ] ) ) {
       
   143 		return false;
       
   144 	}
       
   145 
   142 	$locations = get_nav_menu_locations();
   146 	$locations = get_nav_menu_locations();
   143 	return ( ! empty( $locations[ $location ] ) );
   147 	return ( ! empty( $locations[ $location ] ) );
   144 }
   148 }
   145 
   149 
   146 /**
   150 /**
   158 /**
   162 /**
   159  * Create a Navigation Menu.
   163  * Create a Navigation Menu.
   160  *
   164  *
   161  * @since 3.0.0
   165  * @since 3.0.0
   162  *
   166  *
   163  * @param string $menu_name Menu Name
   167  * @param string $menu_name Menu name.
   164  * @return mixed Menu object on success|WP_Error on failure
   168  * @return int|WP_Error Menu ID on success, WP_Error object on failure.
   165  */
   169  */
   166 function wp_create_nav_menu( $menu_name ) {
   170 function wp_create_nav_menu( $menu_name ) {
   167 	return wp_update_nav_menu_object( 0, array( 'menu-name' => $menu_name ) );
   171 	return wp_update_nav_menu_object( 0, array( 'menu-name' => $menu_name ) );
   168 }
   172 }
   169 
   173 
   170 /**
   174 /**
   171  * Delete a Navigation Menu.
   175  * Delete a Navigation Menu.
   172  *
   176  *
   173  * @since 3.0.0
   177  * @since 3.0.0
   174  *
   178  *
   175  * @param string $menu name|id|slug
   179  * @param string $menu Menu ID, slug, or name.
   176  * @return mixed Menu object on success|WP_Error on failure
   180  * @return bool|WP_Error True on success, false or WP_Error object on failure.
   177  */
   181  */
   178 function wp_delete_nav_menu( $menu ) {
   182 function wp_delete_nav_menu( $menu ) {
   179 	$menu = wp_get_nav_menu_object( $menu );
   183 	$menu = wp_get_nav_menu_object( $menu );
   180 	if ( ! $menu )
   184 	if ( ! $menu )
   181 		return false;
   185 		return false;
   196 			$locations[ $location ] = 0;
   200 			$locations[ $location ] = 0;
   197 	}
   201 	}
   198 	set_theme_mod( 'nav_menu_locations', $locations );
   202 	set_theme_mod( 'nav_menu_locations', $locations );
   199 
   203 
   200 	if ( $result && !is_wp_error($result) )
   204 	if ( $result && !is_wp_error($result) )
       
   205 
       
   206 		/**
       
   207 		 * Fires after a navigation menu has been successfully deleted.
       
   208 		 *
       
   209 		 * @since 3.0.0
       
   210 		 *
       
   211 		 * @param int $term_id ID of the deleted menu.
       
   212 		 */
   201 		do_action( 'wp_delete_nav_menu', $menu->term_id );
   213 		do_action( 'wp_delete_nav_menu', $menu->term_id );
   202 
   214 
   203 	return $result;
   215 	return $result;
   204 }
   216 }
   205 
   217 
   208  *
   220  *
   209  * @since 3.0.0
   221  * @since 3.0.0
   210  *
   222  *
   211  * @param int $menu_id The ID of the menu or "0" to create a new menu.
   223  * @param int $menu_id The ID of the menu or "0" to create a new menu.
   212  * @param array $menu_data The array of menu data.
   224  * @param array $menu_data The array of menu data.
   213  * @return int|error object The menu's ID or WP_Error object.
   225  * @return int|WP_Error Menu ID on success, WP_Error object on failure.
   214  */
   226  */
   215 function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) {
   227 function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) {
   216 	$menu_id = (int) $menu_id;
   228 	$menu_id = (int) $menu_id;
   217 
   229 
   218 	$_menu = wp_get_nav_menu_object( $menu_id );
   230 	$_menu = wp_get_nav_menu_object( $menu_id );
   244 		$_menu = wp_insert_term( $menu_data['menu-name'], 'nav_menu', $args );
   256 		$_menu = wp_insert_term( $menu_data['menu-name'], 'nav_menu', $args );
   245 
   257 
   246 		if ( is_wp_error( $_menu ) )
   258 		if ( is_wp_error( $_menu ) )
   247 			return $_menu;
   259 			return $_menu;
   248 
   260 
       
   261 		/**
       
   262 		 * Fires after a navigation menu is successfully created.
       
   263 		 *
       
   264 		 * @since 3.0.0
       
   265 		 *
       
   266 		 * @param int   $term_id   ID of the new menu.
       
   267 		 * @param array $menu_data An array of menu data.
       
   268 		 */
   249 		do_action( 'wp_create_nav_menu', $_menu['term_id'], $menu_data );
   269 		do_action( 'wp_create_nav_menu', $_menu['term_id'], $menu_data );
   250 
   270 
   251 		return (int) $_menu['term_id'];
   271 		return (int) $_menu['term_id'];
   252 	}
   272 	}
   253 
   273 
   259 	$update_response = wp_update_term( $menu_id, 'nav_menu', $args );
   279 	$update_response = wp_update_term( $menu_id, 'nav_menu', $args );
   260 
   280 
   261 	if ( is_wp_error( $update_response ) )
   281 	if ( is_wp_error( $update_response ) )
   262 		return $update_response;
   282 		return $update_response;
   263 
   283 
       
   284 	/**
       
   285 	 * Fires after a navigation menu has been successfully updated.
       
   286 	 *
       
   287 	 * @since 3.0.0
       
   288 	 *
       
   289 	 * @param int   $menu_id   ID of the updated menu.
       
   290 	 * @param array $menu_data An array of menu data.
       
   291 	 */
   264 	do_action( 'wp_update_nav_menu', $menu_id, $menu_data );
   292 	do_action( 'wp_update_nav_menu', $menu_id, $menu_data );
   265 	return $menu_id;
   293 	return $menu_id;
   266 }
   294 }
   267 
   295 
   268 /**
   296 /**
   271  * @since 3.0.0
   299  * @since 3.0.0
   272  *
   300  *
   273  * @param int $menu_id The ID of the menu. Required. If "0", makes the menu item a draft orphan.
   301  * @param int $menu_id The ID of the menu. Required. If "0", makes the menu item a draft orphan.
   274  * @param int $menu_item_db_id The ID of the menu item. If "0", creates a new menu item.
   302  * @param int $menu_item_db_id The ID of the menu item. If "0", creates a new menu item.
   275  * @param array $menu_item_data The menu item's data.
   303  * @param array $menu_item_data The menu item's data.
   276  * @return int The menu item's database ID or WP_Error object on failure.
   304  * @return int|WP_Error The menu item's database ID or WP_Error object on failure.
   277  */
   305  */
   278 function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array() ) {
   306 function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array() ) {
   279 	$menu_id = (int) $menu_id;
   307 	$menu_id = (int) $menu_id;
   280 	$menu_item_db_id = (int) $menu_item_db_id;
   308 	$menu_item_db_id = (int) $menu_item_db_id;
   281 
   309 
   282 	// make sure that we don't convert non-nav_menu_item objects into nav_menu_item objects
   310 	// make sure that we don't convert non-nav_menu_item objects into nav_menu_item objects
   283 	if ( ! empty( $menu_item_db_id ) && ! is_nav_menu_item( $menu_item_db_id ) )
   311 	if ( ! empty( $menu_item_db_id ) && ! is_nav_menu_item( $menu_item_db_id ) )
   284 		return new WP_Error('update_nav_menu_item_failed', __('The given object ID is not that of a menu item.'));
   312 		return new WP_Error( 'update_nav_menu_item_failed', __( 'The given object ID is not that of a menu item.' ) );
   285 
   313 
   286 	$menu = wp_get_nav_menu_object( $menu_id );
   314 	$menu = wp_get_nav_menu_object( $menu_id );
   287 
   315 
   288 	if ( ( ! $menu && 0 !== $menu_id ) || is_wp_error( $menu ) )
   316 	if ( ! $menu && 0 !== $menu_id ) {
       
   317 		return new WP_Error( 'invalid_menu_id', __( 'Invalid menu ID.' ) );
       
   318 	}
       
   319 
       
   320 	if ( is_wp_error( $menu ) ) {
   289 		return $menu;
   321 		return $menu;
       
   322 	}
   290 
   323 
   291 	$defaults = array(
   324 	$defaults = array(
   292 		'menu-item-db-id' => $menu_item_db_id,
   325 		'menu-item-db-id' => $menu_item_db_id,
   293 		'menu-item-object-id' => 0,
   326 		'menu-item-object-id' => 0,
   294 		'menu-item-object' => '',
   327 		'menu-item-object' => '',
   355 		'post_type' => 'nav_menu_item',
   388 		'post_type' => 'nav_menu_item',
   356 	);
   389 	);
   357 
   390 
   358 	$update = 0 != $menu_item_db_id;
   391 	$update = 0 != $menu_item_db_id;
   359 
   392 
   360 	// Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms()
       
   361 	if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) )
       
   362 		$post['tax_input'] = array( 'nav_menu' => array( intval( $menu->term_id ) ) );
       
   363 
       
   364 	// New menu item. Default is draft status
   393 	// New menu item. Default is draft status
   365 	if ( ! $update ) {
   394 	if ( ! $update ) {
   366 		$post['ID'] = 0;
   395 		$post['ID'] = 0;
   367 		$post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft';
   396 		$post['post_status'] = 'publish' == $args['menu-item-status'] ? 'publish' : 'draft';
   368 		$menu_item_db_id = wp_insert_post( $post );
   397 		$menu_item_db_id = wp_insert_post( $post );
   369 		if ( ! $menu_item_db_id	|| is_wp_error( $menu_item_db_id ) )
   398 		if ( ! $menu_item_db_id	|| is_wp_error( $menu_item_db_id ) )
   370 			return $menu_item_db_id;
   399 			return $menu_item_db_id;
   371 	}
   400 	}
   372 
   401 
       
   402 	// Associate the menu item with the menu term
       
   403 	// Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms()
       
   404 	 if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) ) {
       
   405 		wp_set_object_terms( $menu_item_db_id, array( $menu->term_id ), 'nav_menu' );
       
   406 	}
       
   407 
   373 	if ( 'custom' == $args['menu-item-type'] ) {
   408 	if ( 'custom' == $args['menu-item-type'] ) {
   374 		$args['menu-item-object-id'] = $menu_item_db_id;
   409 		$args['menu-item-object-id'] = $menu_item_db_id;
   375 		$args['menu-item-object'] = 'custom';
   410 		$args['menu-item-object'] = 'custom';
   376 	}
   411 	}
   377 
   412 
   399 		$post['ID'] = $menu_item_db_id;
   434 		$post['ID'] = $menu_item_db_id;
   400 		$post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish';
   435 		$post['post_status'] = 'draft' == $args['menu-item-status'] ? 'draft' : 'publish';
   401 		wp_update_post( $post );
   436 		wp_update_post( $post );
   402 	}
   437 	}
   403 
   438 
   404 	do_action('wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args );
   439 	/**
       
   440 	 * Fires after a navigation menu item has been updated.
       
   441 	 *
       
   442 	 * @since 3.0.0
       
   443 	 *
       
   444 	 * @see wp_update_nav_menu_item()
       
   445 	 *
       
   446 	 * @param int   $menu_id         ID of the updated menu.
       
   447 	 * @param int   $menu_item_db_id ID of the updated menu item.
       
   448 	 * @param array $args            An array of arguments used to update a menu item.
       
   449 	 */
       
   450 	do_action( 'wp_update_nav_menu_item', $menu_id, $menu_item_db_id, $args );
   405 
   451 
   406 	return $menu_item_db_id;
   452 	return $menu_item_db_id;
   407 }
   453 }
   408 
   454 
   409 /**
   455 /**
   410  * Returns all navigation menu objects.
   456  * Returns all navigation menu objects.
   411  *
   457  *
   412  * @since 3.0.0
   458  * @since 3.0.0
   413  *
   459  * @since 4.1.0 Default value of the 'orderby' argument was changed from 'none'
   414  * @param array $args Array of arguments passed on to get_terms().
   460  *              to 'name'.
   415  * @return array menu objects
   461  *
       
   462  * @param array $args Optional. Array of arguments passed on to {@see get_terms()}.
       
   463  *                    Default empty array.
       
   464  * @return array Menu objects.
   416  */
   465  */
   417 function wp_get_nav_menus( $args = array() ) {
   466 function wp_get_nav_menus( $args = array() ) {
   418 	$defaults = array( 'hide_empty' => false, 'orderby' => 'none' );
   467 	$defaults = array( 'hide_empty' => false, 'orderby' => 'name' );
   419 	$args = wp_parse_args( $args, $defaults );
   468 	$args = wp_parse_args( $args, $defaults );
       
   469 
       
   470 	/**
       
   471 	 * Filter the navigation menu objects being returned.
       
   472 	 *
       
   473 	 * @since 3.0.0
       
   474 	 *
       
   475 	 * @see get_terms()
       
   476 	 *
       
   477 	 * @param array $menus An array of menu objects.
       
   478 	 * @param array $args  An array of arguments used to retrieve menu objects.
       
   479 	 */
   420 	return apply_filters( 'wp_get_nav_menus', get_terms( 'nav_menu',  $args), $args );
   480 	return apply_filters( 'wp_get_nav_menus', get_terms( 'nav_menu',  $args), $args );
   421 }
   481 }
   422 
   482 
   423 /**
   483 /**
   424  * Sort menu items by the desired key.
   484  * Sort menu items by the desired key.
   449 	else
   509 	else
   450 		return strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop );
   510 		return strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop );
   451 }
   511 }
   452 
   512 
   453 /**
   513 /**
   454  * Returns if a menu item is valid. Bug #13958
   514  * Return if a menu item is valid.
       
   515  *
       
   516  * @link https://core.trac.wordpress.org/ticket/13958
   455  *
   517  *
   456  * @since 3.2.0
   518  * @since 3.2.0
   457  * @access private
   519  * @access private
   458  *
   520  *
   459  * @param object $menu_item The menu item to check
   521  * @param object $item The menu item to check.
   460  * @return bool false if invalid, else true.
   522  * @return bool False if invalid, otherwise true.
   461  */
   523  */
   462 function _is_valid_nav_menu_item( $item ) {
   524 function _is_valid_nav_menu_item( $item ) {
   463 	if ( ! empty( $item->_invalid ) )
   525 	if ( ! empty( $item->_invalid ) )
   464 		return false;
   526 		return false;
   465 
   527 
   466 	return true;
   528 	return true;
   467 }
   529 }
   468 
   530 
   469 /**
   531 /**
   470  * Returns all menu items of a navigation menu.
   532  * Return all menu items of a navigation menu.
   471  *
   533  *
   472  * @since 3.0.0
   534  * @since 3.0.0
   473  *
   535  *
   474  * @param string $menu menu name, id, or slug
   536  * @param string $menu Menu name, ID, or slug.
   475  * @param string $args
   537  * @param array  $args Optional. Arguments to pass to {@see get_posts()}.
   476  * @return mixed $items array of menu items, else false.
   538  * @return mixed $items Array of menu items, otherwise false.
   477  */
   539  */
   478 function wp_get_nav_menu_items( $menu, $args = array() ) {
   540 function wp_get_nav_menu_items( $menu, $args = array() ) {
   479 	$menu = wp_get_nav_menu_object( $menu );
   541 	$menu = wp_get_nav_menu_object( $menu );
   480 
   542 
   481 	if ( ! $menu )
   543 	if ( ! $menu )
   489 		return $items;
   551 		return $items;
   490 
   552 
   491 	$defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item',
   553 	$defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item',
   492 		'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true );
   554 		'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true );
   493 	$args = wp_parse_args( $args, $defaults );
   555 	$args = wp_parse_args( $args, $defaults );
   494 	if ( count( $items ) > 1 )
   556 	$args['include'] = $items;
   495 		$args['include'] = implode( ',', $items );
       
   496 	else
       
   497 		$args['include'] = $items[0];
       
   498 
   557 
   499 	$items = get_posts( $args );
   558 	$items = get_posts( $args );
   500 
   559 
   501 	if ( is_wp_error( $items ) || ! is_array( $items ) )
   560 	if ( is_wp_error( $items ) || ! is_array( $items ) )
   502 		return false;
   561 		return false;
   544 		foreach( $items as $k => $item ) {
   603 		foreach( $items as $k => $item ) {
   545 			$items[$k]->$args['output_key'] = $i++;
   604 			$items[$k]->$args['output_key'] = $i++;
   546 		}
   605 		}
   547 	}
   606 	}
   548 
   607 
       
   608 	/**
       
   609 	 * Filter the navigation menu items being returned.
       
   610 	 *
       
   611 	 * @since 3.0.0
       
   612 	 *
       
   613 	 * @param array  $items An array of menu item post objects.
       
   614 	 * @param object $menu  The menu object.
       
   615 	 * @param array  $args  An array of arguments used to retrieve menu item objects.
       
   616 	 */
   549 	return apply_filters( 'wp_get_nav_menu_items',  $items, $menu, $args );
   617 	return apply_filters( 'wp_get_nav_menu_items',  $items, $menu, $args );
   550 }
   618 }
   551 
   619 
   552 /**
   620 /**
   553  * Decorates a menu item object with the shared navigation menu item properties.
   621  * Decorates a menu item object with the shared navigation menu item properties.
   593 
   661 
   594 				$menu_item->url = get_permalink( $menu_item->object_id );
   662 				$menu_item->url = get_permalink( $menu_item->object_id );
   595 
   663 
   596 				$original_object = get_post( $menu_item->object_id );
   664 				$original_object = get_post( $menu_item->object_id );
   597 				$original_title = $original_object->post_title;
   665 				$original_title = $original_object->post_title;
       
   666 
       
   667 				if ( '' === $original_title ) {
       
   668 					$original_title = sprintf( __( '#%d (no title)' ), $original_object->ID );
       
   669 				}
       
   670 
   598 				$menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
   671 				$menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
   599 
   672 
   600 			} elseif ( 'taxonomy' == $menu_item->type ) {
   673 			} elseif ( 'taxonomy' == $menu_item->type ) {
   601 				$object = get_taxonomy( $menu_item->object );
   674 				$object = get_taxonomy( $menu_item->object );
   602 				if ( $object ) {
   675 				if ( $object ) {
   613 				if ( is_wp_error( $original_title ) )
   686 				if ( is_wp_error( $original_title ) )
   614 					$original_title = false;
   687 					$original_title = false;
   615 				$menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
   688 				$menu_item->title = '' == $menu_item->post_title ? $original_title : $menu_item->post_title;
   616 
   689 
   617 			} else {
   690 			} else {
   618 				$menu_item->type_label = __('Custom');
   691 				$menu_item->type_label = __('Custom Link');
   619 				$menu_item->title = $menu_item->post_title;
   692 				$menu_item->title = $menu_item->post_title;
   620 				$menu_item->url = empty( $menu_item->url ) ? get_post_meta( $menu_item->ID, '_menu_item_url', true ) : $menu_item->url;
   693 				$menu_item->url = empty( $menu_item->url ) ? get_post_meta( $menu_item->ID, '_menu_item_url', true ) : $menu_item->url;
   621 			}
   694 			}
   622 
   695 
   623 			$menu_item->target = empty( $menu_item->target ) ? get_post_meta( $menu_item->ID, '_menu_item_target', true ) : $menu_item->target;
   696 			$menu_item->target = empty( $menu_item->target ) ? get_post_meta( $menu_item->ID, '_menu_item_target', true ) : $menu_item->target;
   624 
   697 
       
   698 			/**
       
   699 			 * Filter a navigation menu item's title attribute.
       
   700 			 *
       
   701 			 * @since 3.0.0
       
   702 			 *
       
   703 			 * @param string $item_title The menu item title attribute.
       
   704 			 */
   625 			$menu_item->attr_title = empty( $menu_item->attr_title ) ? apply_filters( 'nav_menu_attr_title', $menu_item->post_excerpt ) : $menu_item->attr_title;
   705 			$menu_item->attr_title = empty( $menu_item->attr_title ) ? apply_filters( 'nav_menu_attr_title', $menu_item->post_excerpt ) : $menu_item->attr_title;
   626 
   706 
   627 			if ( empty( $menu_item->description ) )
   707 			if ( empty( $menu_item->description ) ) {
   628 				$menu_item->description = apply_filters( 'nav_menu_description',  wp_trim_words( $menu_item->post_content, 200 ) );
   708 				/**
       
   709 				 * Filter a navigation menu item's description.
       
   710 				 *
       
   711 				 * @since 3.0.0
       
   712 				 *
       
   713 				 * @param string $description The menu item description.
       
   714 				 */
       
   715 				$menu_item->description = apply_filters( 'nav_menu_description', wp_trim_words( $menu_item->post_content, 200 ) );
       
   716 			}
   629 
   717 
   630 			$menu_item->classes = empty( $menu_item->classes ) ? (array) get_post_meta( $menu_item->ID, '_menu_item_classes', true ) : $menu_item->classes;
   718 			$menu_item->classes = empty( $menu_item->classes ) ? (array) get_post_meta( $menu_item->ID, '_menu_item_classes', true ) : $menu_item->classes;
   631 			$menu_item->xfn = empty( $menu_item->xfn ) ? get_post_meta( $menu_item->ID, '_menu_item_xfn', true ) : $menu_item->xfn;
   719 			$menu_item->xfn = empty( $menu_item->xfn ) ? get_post_meta( $menu_item->ID, '_menu_item_xfn', true ) : $menu_item->xfn;
   632 		} else {
   720 		} else {
   633 			$menu_item->db_id = 0;
   721 			$menu_item->db_id = 0;
   644 
   732 
   645 			$menu_item->title = $menu_item->post_title;
   733 			$menu_item->title = $menu_item->post_title;
   646 			$menu_item->url = get_permalink( $menu_item->ID );
   734 			$menu_item->url = get_permalink( $menu_item->ID );
   647 			$menu_item->target = '';
   735 			$menu_item->target = '';
   648 
   736 
       
   737 			/** This filter is documented in wp-includes/nav-menu.php */
   649 			$menu_item->attr_title = apply_filters( 'nav_menu_attr_title', '' );
   738 			$menu_item->attr_title = apply_filters( 'nav_menu_attr_title', '' );
       
   739 
       
   740 			/** This filter is documented in wp-includes/nav-menu.php */
   650 			$menu_item->description = apply_filters( 'nav_menu_description', '' );
   741 			$menu_item->description = apply_filters( 'nav_menu_description', '' );
   651 			$menu_item->classes = array();
   742 			$menu_item->classes = array();
   652 			$menu_item->xfn = '';
   743 			$menu_item->xfn = '';
   653 		}
   744 		}
   654 	} elseif ( isset( $menu_item->taxonomy ) ) {
   745 	} elseif ( isset( $menu_item->taxonomy ) ) {
   671 		$menu_item->classes = array();
   762 		$menu_item->classes = array();
   672 		$menu_item->xfn = '';
   763 		$menu_item->xfn = '';
   673 
   764 
   674 	}
   765 	}
   675 
   766 
       
   767 	/**
       
   768 	 * Filter a navigation menu item object.
       
   769 	 *
       
   770 	 * @since 3.0.0
       
   771 	 *
       
   772 	 * @param object $menu_item The menu item object.
       
   773 	 */
   676 	return apply_filters( 'wp_setup_nav_menu_item', $menu_item );
   774 	return apply_filters( 'wp_setup_nav_menu_item', $menu_item );
   677 }
   775 }
   678 
   776 
   679 /**
   777 /**
   680  * Get the menu items associated with a particular object.
   778  * Get the menu items associated with a particular object.
   700 			'posts_per_page' => -1,
   798 			'posts_per_page' => -1,
   701 		)
   799 		)
   702 	);
   800 	);
   703 	foreach( (array) $menu_items as $menu_item ) {
   801 	foreach( (array) $menu_items as $menu_item ) {
   704 		if ( isset( $menu_item->ID ) && is_nav_menu_item( $menu_item->ID ) ) {
   802 		if ( isset( $menu_item->ID ) && is_nav_menu_item( $menu_item->ID ) ) {
   705 			if ( get_post_meta( $menu_item->ID, '_menu_item_type', true ) !== $object_type ||
   803 			$menu_item_type = get_post_meta( $menu_item->ID, '_menu_item_type', true );
   706 				get_post_meta( $menu_item->ID, '_menu_item_object', true ) !== $taxonomy )
   804 			if (
   707 				continue;
   805 				'post_type' == $object_type &&
   708 
   806 				'post_type' == $menu_item_type
   709 			$menu_item_ids[] = (int) $menu_item->ID;
   807 			) {
       
   808 				$menu_item_ids[] = (int) $menu_item->ID;
       
   809 			} elseif (
       
   810 				'taxonomy' == $object_type &&
       
   811 				'taxonomy' == $menu_item_type &&
       
   812 				get_post_meta( $menu_item->ID, '_menu_item_object', true ) == $taxonomy
       
   813 			) {
       
   814 				$menu_item_ids[] = (int) $menu_item->ID;
       
   815 			}
   710 		}
   816 		}
   711 	}
   817 	}
   712 
   818 
   713 	return array_unique( $menu_item_ids );
   819 	return array_unique( $menu_item_ids );
   714 }
   820 }