函数文档

rest_get_endpoint_args_for_schema()

💡 云策文档标注

概述

rest_get_endpoint_args_for_schema() 函数用于从 JSON 模式中提取端点参数数组,支持根据 HTTP 方法(如 CREATABLE 或 EDITABLE)调整参数处理,如默认值和必需性检查。

关键要点

  • 函数接受两个参数:$schema(必需,JSON 模式数组)和 $method(可选,HTTP 方法,默认为 WP_REST_Server::CREATABLE)。
  • 返回一个数组,包含基于模式属性生成的端点参数,包括验证和清理回调。
  • 对于 CREATABLE 端点,会处理默认值和必需参数;对于 EDITABLE 端点,则忽略这些。
  • 函数会跳过只读属性,并合并 arg_options 中的额外选项。

代码示例

function rest_get_endpoint_args_for_schema( $schema, $method = WP_REST_Server::CREATABLE ) {
    $schema_properties       = ! empty( $schema['properties'] ) ? $schema['properties'] : array();
    $endpoint_args           = array();
    $valid_schema_properties = rest_get_allowed_schema_keywords();
    $valid_schema_properties = array_diff( $valid_schema_properties, array( 'default', 'required' ) );

    foreach ( $schema_properties as $field_id => $params ) {
        if ( ! empty( $params['readonly'] ) ) {
            continue;
        }

        $endpoint_args[ $field_id ] = array(
            'validate_callback' => 'rest_validate_request_arg',
            'sanitize_callback' => 'rest_sanitize_request_arg',
        );

        if ( WP_REST_Server::CREATABLE === $method && isset( $params['default'] ) ) {
            $endpoint_args[ $field_id ]['default'] = $params['default'];
        }

        if ( WP_REST_Server::CREATABLE === $method && ! empty( $params['required'] ) ) {
            $endpoint_args[ $field_id ]['required'] = true;
        }

        foreach ( $valid_schema_properties as $schema_prop ) {
            if ( isset( $params[ $schema_prop ] ) ) {
                $endpoint_args[ $field_id ][ $schema_prop ] = $params[ $schema_prop ];
            }
        }

        if ( isset( $params['arg_options'] ) ) {
            if ( WP_REST_Server::CREATABLE !== $method ) {
                $params['arg_options'] = array_diff_key(
                    $params['arg_options'],
                    array(
                        'required' => '',
                        'default'  => '',
                    )
                );
            }
            $endpoint_args[ $field_id ] = array_merge( $endpoint_args[ $field_id ], $params['arg_options'] );
        }
    }
    return $endpoint_args;
}

注意事项

  • 函数在 WordPress 5.6.0 版本中引入,是 REST API 开发的关键工具。
  • 依赖 rest_get_allowed_schema_keywords() 获取有效的 JSON 模式关键字。
  • 常用于 WP_REST_Controller::get_endpoint_args_for_item_schema() 中,以简化端点参数生成。

📄 原文内容

Retrieves an array of endpoint arguments from the item schema and endpoint method.

Parameters

$schemaarrayrequired
The full JSON schema for the endpoint.
$methodstringoptional
HTTP method of the endpoint. The arguments for CREATABLE endpoints are checked for required values and may fall-back to a given default, this is not done on EDITABLE endpoints.

Default:WP_REST_Server::CREATABLE

Return

array The endpoint arguments.

Source

function rest_get_endpoint_args_for_schema( $schema, $method = WP_REST_Server::CREATABLE ) {

	$schema_properties       = ! empty( $schema['properties'] ) ? $schema['properties'] : array();
	$endpoint_args           = array();
	$valid_schema_properties = rest_get_allowed_schema_keywords();
	$valid_schema_properties = array_diff( $valid_schema_properties, array( 'default', 'required' ) );

	foreach ( $schema_properties as $field_id => $params ) {

		// Arguments specified as `readonly` are not allowed to be set.
		if ( ! empty( $params['readonly'] ) ) {
			continue;
		}

		$endpoint_args[ $field_id ] = array(
			'validate_callback' => 'rest_validate_request_arg',
			'sanitize_callback' => 'rest_sanitize_request_arg',
		);

		if ( WP_REST_Server::CREATABLE === $method && isset( $params['default'] ) ) {
			$endpoint_args[ $field_id ]['default'] = $params['default'];
		}

		if ( WP_REST_Server::CREATABLE === $method && ! empty( $params['required'] ) ) {
			$endpoint_args[ $field_id ]['required'] = true;
		}

		foreach ( $valid_schema_properties as $schema_prop ) {
			if ( isset( $params[ $schema_prop ] ) ) {
				$endpoint_args[ $field_id ][ $schema_prop ] = $params[ $schema_prop ];
			}
		}

		// Merge in any options provided by the schema property.
		if ( isset( $params['arg_options'] ) ) {

			// Only use required / default from arg_options on CREATABLE endpoints.
			if ( WP_REST_Server::CREATABLE !== $method ) {
				$params['arg_options'] = array_diff_key(
					$params['arg_options'],
					array(
						'required' => '',
						'default'  => '',
					)
				);
			}

			$endpoint_args[ $field_id ] = array_merge( $endpoint_args[ $field_id ], $params['arg_options'] );
		}
	}

	return $endpoint_args;
}

Changelog

Version Description
5.6.0 Introduced.