WP_REST_Menu_Items_Controller::prepare_item_for_response( WP_Post $item, WP_REST_Request $request ): WP_REST_Response

In this article

Prepares a single post output for response.

Parameters

$itemWP_Postrequired
Post object.
$requestWP_REST_Requestrequired
Request object.

Return

WP_REST_Response Response object.

Source

public function prepare_item_for_response( $item, $request ) {
	// Base fields for every post.
	$fields    = $this->get_fields_for_response( $request );
	$menu_item = $this->get_nav_menu_item( $item->ID );
	$data      = array();

	if ( rest_is_field_included( 'id', $fields ) ) {
		$data['id'] = $menu_item->ID;
	}

	if ( rest_is_field_included( 'title', $fields ) ) {
		$data['title'] = array();
	}

	if ( rest_is_field_included( 'title.raw', $fields ) ) {
		$data['title']['raw'] = $menu_item->title;
	}

	if ( rest_is_field_included( 'title.rendered', $fields ) ) {
		add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );

		/** This filter is documented in wp-includes/post-template.php */
		$title = apply_filters( 'the_title', $menu_item->title, $menu_item->ID );

		$data['title']['rendered'] = $title;

		remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
	}

	if ( rest_is_field_included( 'status', $fields ) ) {
		$data['status'] = $menu_item->post_status;
	}

	if ( rest_is_field_included( 'url', $fields ) ) {
		$data['url'] = $menu_item->url;
	}

	if ( rest_is_field_included( 'attr_title', $fields ) ) {
		// Same as post_excerpt.
		$data['attr_title'] = $menu_item->attr_title;
	}

	if ( rest_is_field_included( 'description', $fields ) ) {
		// Same as post_content.
		$data['description'] = $menu_item->description;
	}

	if ( rest_is_field_included( 'type', $fields ) ) {
		$data['type'] = $menu_item->type;
	}

	if ( rest_is_field_included( 'type_label', $fields ) ) {
		$data['type_label'] = $menu_item->type_label;
	}

	if ( rest_is_field_included( 'object', $fields ) ) {
		$data['object'] = $menu_item->object;
	}

	if ( rest_is_field_included( 'object_id', $fields ) ) {
		// It is stored as a string, but should be exposed as an integer.
		$data['object_id'] = absint( $menu_item->object_id );
	}

	if ( rest_is_field_included( 'parent', $fields ) ) {
		// Same as post_parent, exposed as an integer.
		$data['parent'] = (int) $menu_item->menu_item_parent;
	}

	if ( rest_is_field_included( 'menu_order', $fields ) ) {
		// Same as post_parent, exposed as an integer.
		$data['menu_order'] = (int) $menu_item->menu_order;
	}

	if ( rest_is_field_included( 'target', $fields ) ) {
		$data['target'] = $menu_item->target;
	}

	if ( rest_is_field_included( 'classes', $fields ) ) {
		$data['classes'] = (array) $menu_item->classes;
	}

	if ( rest_is_field_included( 'xfn', $fields ) ) {
		$data['xfn'] = array_map( 'sanitize_html_class', explode( ' ', $menu_item->xfn ) );
	}

	if ( rest_is_field_included( 'invalid', $fields ) ) {
		$data['invalid'] = (bool) $menu_item->_invalid;
	}

	if ( rest_is_field_included( 'meta', $fields ) ) {
		$data['meta'] = $this->meta->get_value( $menu_item->ID, $request );
	}

	$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );

	foreach ( $taxonomies as $taxonomy ) {
		$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

		if ( rest_is_field_included( $base, $fields ) ) {
			$terms = get_the_terms( $item, $taxonomy->name );
			if ( ! is_array( $terms ) ) {
				continue;
			}
			$term_ids = $terms ? array_values( wp_list_pluck( $terms, 'term_id' ) ) : array();
			if ( 'nav_menu' === $taxonomy->name ) {
				$data[ $base ] = $term_ids ? array_shift( $term_ids ) : 0;
			} else {
				$data[ $base ] = $term_ids;
			}
		}
	}

	$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
	$data    = $this->add_additional_fields_to_object( $data, $request );
	$data    = $this->filter_response_by_context( $data, $context );

	// Wrap the data in a response object.
	$response = rest_ensure_response( $data );

	if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
		$links = $this->prepare_links( $item );
		$response->add_links( $links );

		if ( ! empty( $links['self']['href'] ) ) {
			$actions = $this->get_available_actions( $item, $request );

			$self = $links['self']['href'];

			foreach ( $actions as $rel ) {
				$response->add_link( $rel, $self );
			}
		}
	}

	/**
	 * Filters the menu item data for a REST API response.
	 *
	 * @since 5.9.0
	 *
	 * @param WP_REST_Response $response  The response object.
	 * @param object           $menu_item Menu item setup by wp_setup_nav_menu_item().
	 * @param WP_REST_Request  $request   Request object.
	 */
	return apply_filters( 'rest_prepare_nav_menu_item', $response, $menu_item, $request );
}

Hooks

apply_filters( ‘rest_prepare_nav_menu_item’, WP_REST_Response $response, object $menu_item, WP_REST_Request $request )

Filters the menu item data for a REST API response.

apply_filters( ‘the_title’, string $post_title, int $post_id )

Filters the post title.

Changelog

VersionDescription
5.9.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.