# 可扩展的 API 接口

Store API 的某些接口可以通过名为 `ExtendSchema` 的类进行扩展。 这允许您自定义 Store API 返回的数据（包括结构化数据），以便您的应用程序或插件可以消费这些数据。

有关扩展 Store API 的更多信息，您可能还对以下内容感兴趣：

-   [如何使用 `ExtendSchema` 将您的数据添加到 Store API](docs/apis/store-api/extending-store-api/extend-store-api-add-data)
-   [如何添加新的接口](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/client/blocks/docs/internal-developers/rest-api/extend-rest-api-new-endpoint.md)

以下是可以使用 `ExtendSchema` 进行扩展的可用接口列表，以及一些示例用例。

## 产品

主要的 `wc/store/products` 接口可以通过 ExtendSchema 进行扩展。 数据通过每个 `product` 在响应数组中的 `extensions` 键提供。

可以使用 `ProductSchema::IDENTIFIER` 键来扩展此接口。 对于此接口，您的 `data_callback` 回调函数会传递 `$product` 作为参数。 您的 `schema_callback` 函数不传递任何其他参数；所有产品应共享相同的结构化数据。

### 用例

此接口适用于添加有关单个产品的附加数据。 这可能是一些元数据、额外的定价，或任何其他支持产品页面上自定义组件的数据。

### 示例

```php
woocommerce_store_api_register_endpoint_data(
	array(
		'endpoint'        => ProductSchema::IDENTIFIER,
		'namespace'       => 'my_plugin_namespace',
		'data_callback'   => function( $product ) {
			return array(
				'my_meta_data' => get_post_meta( $product->get_id(), 'my_meta_data', true ),
			);
		},
		'schema_callback' => function() {
			return array(
				'properties' => array(
					'my_meta_data' => array(
						'type' => 'string',
					),
				),
			);
		},
		'schema_type'     => ARRAY_A,
	)
);
```

## 购物车

主要的 `wc/store/cart` 接口可以通过 ExtendSchema 进行扩展。 数据通过响应中的 `extensions` 键提供。

可以使用 `CartSchema::IDENTIFIER` 键来扩展此接口。 对于此接口，您的 `data_callback` 和 `schema_callback` 函数不传递任何其他参数。

### 用例

此接口适用于向购物车页面添加附加数据，例如，有关购物车中商品的额外数据，或支持购物车页面上显示的自定义组件所需的一切。

### 示例

```php
woocommerce_store_api_register_endpoint_data(
	array(
		'endpoint'        => CartSchema::IDENTIFIER,
		'namespace'       => 'my_plugin_namespace',
		'data_callback'   => function() {
			return array(
				'foo' => 'bar',
			);
		},
		'schema_callback' => function() {
			return array(
				'properties' => array(
					'foo' => array(
						'type' => 'string',
					),
				),
			);
		},
		'schema_type'     => ARRAY_A,
	)
);
```

## 购物车商品

`wc/store/cart/items` 接口，该接口也可用作 `wc/store/cart` 内部的 `items` 键。 数据将包含在 `items` 数组的每个商品中。

该接口可以通过 `CartItemSchema::IDENTIFIER` 键进行扩展。 对于此接口，您的 `data_callback` 回调函数将接收 `$cart_item` 作为参数。 您的 `schema_callback` 函数不接收任何其他参数；所有购物车商品应使用相同的结构化数据。

### 用途

此接口适用于添加有关单个购物车商品的附加数据。 这可能是一些元数据、附加价格，或任何其他支持购物车页面上自定义组件或扩展的功能。

### 示例

```php
woocommerce_store_api_register_endpoint_data(
	array(
		'endpoint'        => CartItemSchema::IDENTIFIER,
		'namespace'       => 'my_plugin_namespace',
		'data_callback'   => function( $cart_item ) {
			$product = $cart_item['data'];
			return array(
				'my_meta_data' => get_post_meta( $product->get_id(), 'my_meta_data', true ),
			);
		},
		'schema_callback' => function() {
			return array(
				'properties' => array(
					'my_meta_data' => array(
						'type' => 'string',
					),
				),
			);
		},
		'schema_type'     => ARRAY_A,
	)
);
```

## 结账

`wc/store/checkout` 接口可以通过 ExtendSchema 进行扩展。 响应中的 `extensions` 键包含可用的附加数据。

该接口可以通过 `CheckoutSchema::IDENTIFIER` 键进行扩展。 对于此接口，您的 `data_callback` 和 `schema_callback` 函数不接收任何其他参数。

### 用途

此接口适用于向结账页面添加附加数据，例如自定义支付方法，该方法需要从用户或服务器收集额外的数据。

⚠ **重要：不要在此接口中泄露任何敏感数据，因为它对公众开放。 这包括用于支付服务的私钥。**

### 示例

```php
woocommerce_store_api_register_endpoint_data(
	array(
		'endpoint'        => CheckoutSchema::IDENTIFIER,
		'namespace'       => 'my_plugin_namespace',
		'data_callback'   => function() {
			return array(
				'foo' => 'bar',
			);
		},
		'schema_callback' => function() {
			return array(
				'properties' => array(
					'foo' => array(
						'type' => 'string',
					),
				),
			);
		},
		'schema_type'     => ARRAY_A,
	)
);
```