WC_REST_Controller::get_fields_for_response()publicWC 3.5.0

Gets an array of fields to be included on the response.

Included fields are based on item schema and _fields= request argument. Updated from WordPress 5.3, included into this class to support old versions.

Method of the class: WC_REST_Controller{}

No Hooks.

Return

Array. Fields to be included in the response.

Usage

$WC_REST_Controller = new WC_REST_Controller();
$WC_REST_Controller->get_fields_for_response( $request );
$request(WP_REST_Request) (required)
Full details about the request.

Changelog

Since 3.5.0 Introduced.

WC_REST_Controller::get_fields_for_response() code WC 9.8.1

public function get_fields_for_response( $request ) {
	// From xdebug profiling, this method could take upto 25% of request time in index calls.
	// Cache it and make sure _fields was cached on current request object!
	// TODO: Submit this caching behavior in core.
	if ( isset( $this->_fields ) && is_array( $this->_fields ) && $request === $this->_request ) {
		return $this->_fields;
	}
	$this->_request = $request;

	$schema     = $this->get_item_schema();
	$properties = isset( $schema['properties'] ) ? $schema['properties'] : array();

	$additional_fields = $this->get_additional_fields();

	foreach ( $additional_fields as $field_name => $field_options ) {
		// For back-compat, include any field with an empty schema
		// because it won't be present in $this->get_item_schema().
		if ( is_null( $field_options['schema'] ) ) {
			$properties[ $field_name ] = $field_options;
		}
	}

	// Exclude fields that specify a different context than the request context.
	$context = $request['context'];
	if ( $context ) {
		foreach ( $properties as $name => $options ) {
			if ( ! empty( $options['context'] ) && ! in_array( $context, $options['context'], true ) ) {
				unset( $properties[ $name ] );
			}
		}
	}

	$fields = array_keys( $properties );

	if ( ! isset( $request['_fields'] ) ) {
		$this->_fields = $fields;
		return $fields;
	}
	$requested_fields = wp_parse_list( $request['_fields'] );
	if ( 0 === count( $requested_fields ) ) {
		$this->_fields = $fields;
		return $fields;
	}
	// Trim off outside whitespace from the comma delimited list.
	$requested_fields = array_map( 'trim', $requested_fields );
	// Always persist 'id', because it can be needed for add_additional_fields_to_object().
	if ( in_array( 'id', $fields, true ) ) {
		$requested_fields[] = 'id';
	}
	// Return the list of all requested fields which appear in the schema.
	$this->_fields = array_reduce(
		$requested_fields,
		function ( $response_fields, $field ) use ( $fields ) {
			if ( in_array( $field, $fields, true ) ) {
				$response_fields[] = $field;
				return $response_fields;
			}
			// Check for nested fields if $field is not a direct match.
			$nested_fields = explode( '.', $field );
			// A nested field is included so long as its top-level property
			// is present in the schema.
			if ( in_array( $nested_fields[0], $fields, true ) ) {
				$response_fields[] = $field;
			}
			return $response_fields;
		},
		array()
	);
	return $this->_fields;
}