963 lines
32 KiB
PHP
963 lines
32 KiB
PHP
<?php
|
|
/**
|
|
* REST API Products controller
|
|
*
|
|
* Handles requests to the /products endpoint.
|
|
*
|
|
* @author WooThemes
|
|
* @category API
|
|
* @package WooCommerce/API
|
|
* @since 2.6.0
|
|
*/
|
|
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* REST API Products controller class.
|
|
*
|
|
* @package WooCommerce/API
|
|
* @extends WC_REST_Products_V1_Controller
|
|
*/
|
|
class WC_REST_Products_Controller extends WC_REST_Products_V1_Controller {
|
|
|
|
/**
|
|
* Endpoint namespace.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $namespace = 'wc/v2';
|
|
|
|
/**
|
|
* Query args.
|
|
*
|
|
* @param array $args Request args.
|
|
* @param WP_REST_Request $request Request data.
|
|
* @return array
|
|
*/
|
|
public function query_args( $args, $request ) {
|
|
// Set post_status.
|
|
$args['post_status'] = $request['status'];
|
|
|
|
// Taxonomy query to filter products by type, category,
|
|
// tag, shipping class, and attribute.
|
|
$tax_query = array();
|
|
|
|
// Map between taxonomy name and arg's key.
|
|
$taxonomies = array(
|
|
'product_cat' => 'category',
|
|
'product_tag' => 'tag',
|
|
'product_shipping_class' => 'shipping_class',
|
|
);
|
|
|
|
// Set tax_query for each passed arg.
|
|
foreach ( $taxonomies as $taxonomy => $key ) {
|
|
if ( ! empty( $request[ $key ] ) ) {
|
|
$tax_query[] = array(
|
|
'taxonomy' => $taxonomy,
|
|
'field' => 'term_id',
|
|
'terms' => $request[ $key ],
|
|
);
|
|
}
|
|
}
|
|
|
|
// Filter product type by slug.
|
|
if ( ! empty( $request['type'] ) ) {
|
|
$tax_query[] = array(
|
|
'taxonomy' => 'product_type',
|
|
'field' => 'slug',
|
|
'terms' => $request['type'],
|
|
);
|
|
}
|
|
|
|
// Filter by attribute and term.
|
|
if ( ! empty( $request['attribute'] ) && ! empty( $request['attribute_term'] ) ) {
|
|
if ( in_array( $request['attribute'], wc_get_attribute_taxonomy_names(), true ) ) {
|
|
$tax_query[] = array(
|
|
'taxonomy' => $request['attribute'],
|
|
'field' => 'term_id',
|
|
'terms' => $request['attribute_term'],
|
|
);
|
|
}
|
|
}
|
|
|
|
if ( ! empty( $tax_query ) ) {
|
|
$args['tax_query'] = $tax_query;
|
|
}
|
|
|
|
// Filter featured.
|
|
if ( is_bool( $request['featured'] ) ) {
|
|
$args['tax_query'][] = array(
|
|
'taxonomy' => 'product_visibility',
|
|
'field' => 'name',
|
|
'terms' => 'featured',
|
|
);
|
|
}
|
|
|
|
// Filter by sku.
|
|
if ( ! empty( $request['sku'] ) ) {
|
|
$skus = explode( ',', $request['sku'] );
|
|
// Include the current string as a SKU too.
|
|
if ( 1 < count( $skus ) ) {
|
|
$skus[] = $request['sku'];
|
|
}
|
|
|
|
$args['meta_query'] = $this->add_meta_query( $args, array(
|
|
'key' => '_sku',
|
|
'value' => $skus,
|
|
'compare' => 'IN',
|
|
) );
|
|
}
|
|
|
|
// Filter by tax class.
|
|
if ( ! empty( $request['tax_class'] ) ) {
|
|
$args['meta_query'] = $this->add_meta_query( $args, array(
|
|
'key' => '_tax_class',
|
|
'value' => 'standard' !== $request['tax_class'] ? $request['tax_class'] : '',
|
|
) );
|
|
}
|
|
|
|
// Price filter.
|
|
if ( ! empty( $request['min_price'] ) || ! empty( $request['max_price'] ) ) {
|
|
$args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) );
|
|
}
|
|
|
|
// Filter product in stock or out of stock.
|
|
if ( is_bool( $request['in_stock'] ) ) {
|
|
$args['meta_query'] = $this->add_meta_query( $args, array(
|
|
'key' => '_stock_status',
|
|
'value' => true === $request['in_stock'] ? 'instock' : 'outofstock',
|
|
) );
|
|
}
|
|
|
|
// Filter by on sale products.
|
|
if ( is_bool( $request['on_sale'] ) ) {
|
|
$on_sale_key = $request['on_sale'] ? 'post__in' : 'post__not_in';
|
|
$args[ $on_sale_key ] += wc_get_product_ids_on_sale();
|
|
}
|
|
|
|
// Apply all WP_Query filters again.
|
|
if ( is_array( $request['filter'] ) ) {
|
|
$args = array_merge( $args, $request['filter'] );
|
|
unset( $args['filter'] );
|
|
}
|
|
|
|
// Force the post_type argument, since it's not a user input variable.
|
|
if ( ! empty( $request['sku'] ) ) {
|
|
$args['post_type'] = array( 'product', 'product_variation' );
|
|
} else {
|
|
$args['post_type'] = $this->post_type;
|
|
}
|
|
|
|
return $args;
|
|
}
|
|
|
|
/**
|
|
* Prepare a single product output for response.
|
|
*
|
|
* @param WP_Post $post Post object.
|
|
* @param WP_REST_Request $request Request object.
|
|
* @return WP_REST_Response
|
|
*/
|
|
public function prepare_item_for_response( $post, $request ) {
|
|
$product = wc_get_product( $post );
|
|
$data = $this->get_product_data( $product );
|
|
|
|
// Add variations to variable products.
|
|
if ( $product->is_type( 'variable' ) && $product->has_child() ) {
|
|
$data['variations'] = $product->get_children();
|
|
}
|
|
|
|
// Add grouped products data.
|
|
if ( $product->is_type( 'grouped' ) && $product->has_child() ) {
|
|
$data['grouped_products'] = $product->get_children();
|
|
}
|
|
|
|
$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 );
|
|
|
|
$response->add_links( $this->prepare_links( $product, $request ) );
|
|
|
|
/**
|
|
* Filter the data for a response.
|
|
*
|
|
* The dynamic portion of the hook name, $this->post_type, refers to post_type of the post being
|
|
* prepared for the response.
|
|
*
|
|
* @param WP_REST_Response $response The response object.
|
|
* @param WP_Post $post Post object.
|
|
* @param WP_REST_Request $request Request object.
|
|
*/
|
|
return apply_filters( "woocommerce_rest_prepare_{$this->post_type}", $response, $post, $request );
|
|
}
|
|
|
|
/**
|
|
* Get product data.
|
|
*
|
|
* @param WC_Product $product Product instance.
|
|
* @return array
|
|
*/
|
|
protected function get_product_data( $product ) {
|
|
$data = parent::get_product_data( $product );
|
|
$data['meta_data'] = $product->get_meta_data();
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Set product meta.
|
|
*
|
|
* @throws WC_REST_Exception REST API exceptions.
|
|
* @param WC_Product $product Product instance.
|
|
* @param WP_REST_Request $request Request data.
|
|
* @return WC_Product
|
|
*/
|
|
protected function set_product_meta( $product, $request ) {
|
|
$product = parent::set_product_meta( $product, $request );
|
|
|
|
// Allow set meta_data.
|
|
if ( is_array( $request['meta_data'] ) ) {
|
|
foreach ( $request['meta_data'] as $meta ) {
|
|
$product->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
|
|
}
|
|
}
|
|
|
|
return $product;
|
|
}
|
|
|
|
/**
|
|
* Update post meta fields.
|
|
*
|
|
* @param WP_Post $post Post data.
|
|
* @param WP_REST_Request $request Request data.
|
|
* @return bool|WP_Error
|
|
*/
|
|
protected function update_post_meta_fields( $post, $request ) {
|
|
$product = wc_get_product( $post );
|
|
|
|
// Check for featured/gallery images, upload it and set it.
|
|
if ( isset( $request['images'] ) ) {
|
|
$product = $this->set_product_images( $product, $request['images'] );
|
|
}
|
|
|
|
// Save product meta fields.
|
|
$product = $this->set_product_meta( $product, $request );
|
|
|
|
// Save the product data.
|
|
$product->save();
|
|
|
|
// Clear caches here so in sync with any new variations/children.
|
|
wc_delete_product_transients( $product->get_id() );
|
|
wp_cache_delete( 'product-' . $product->get_id(), 'products' );
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get the Product's schema, conforming to JSON Schema.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_item_schema() {
|
|
$weight_unit = get_option( 'woocommerce_weight_unit' );
|
|
$dimension_unit = get_option( 'woocommerce_dimension_unit' );
|
|
$schema = array(
|
|
'$schema' => 'http://json-schema.org/draft-04/schema#',
|
|
'title' => $this->post_type,
|
|
'type' => 'object',
|
|
'properties' => array(
|
|
'id' => array(
|
|
'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'name' => array(
|
|
'description' => __( 'Product name.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'slug' => array(
|
|
'description' => __( 'Product slug.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'permalink' => array(
|
|
'description' => __( 'Product URL.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'format' => 'uri',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'date_created' => array(
|
|
'description' => __( "The date the product was created, in the site's timezone.", 'woocommerce' ),
|
|
'type' => 'date-time',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'date_modified' => array(
|
|
'description' => __( "The date the product was last modified, in the site's timezone.", 'woocommerce' ),
|
|
'type' => 'date-time',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'type' => array(
|
|
'description' => __( 'Product type.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'default' => 'simple',
|
|
'enum' => array_keys( wc_get_product_types() ),
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'status' => array(
|
|
'description' => __( 'Product status (post status).', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'default' => 'publish',
|
|
'enum' => array_keys( get_post_statuses() ),
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'featured' => array(
|
|
'description' => __( 'Featured product.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'catalog_visibility' => array(
|
|
'description' => __( 'Catalog visibility.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'default' => 'visible',
|
|
'enum' => array( 'visible', 'catalog', 'search', 'hidden' ),
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'description' => array(
|
|
'description' => __( 'Product description.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'short_description' => array(
|
|
'description' => __( 'Product short description.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'sku' => array(
|
|
'description' => __( 'Unique identifier.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'price' => array(
|
|
'description' => __( 'Current product price.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'regular_price' => array(
|
|
'description' => __( 'Product regular price.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'sale_price' => array(
|
|
'description' => __( 'Product sale price.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'date_on_sale_from' => array(
|
|
'description' => __( 'Start date of sale price.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'date_on_sale_to' => array(
|
|
'description' => __( 'End data of sale price.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'price_html' => array(
|
|
'description' => __( 'Price formatted in HTML.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'on_sale' => array(
|
|
'description' => __( 'Shows if the product is on sale.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'purchasable' => array(
|
|
'description' => __( 'Shows if the product can be bought.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'total_sales' => array(
|
|
'description' => __( 'Amount of sales.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'virtual' => array(
|
|
'description' => __( 'If the product is virtual.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'downloadable' => array(
|
|
'description' => __( 'If the product is downloadable.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'downloads' => array(
|
|
'description' => __( 'List of downloadable files.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'context' => array( 'view', 'edit' ),
|
|
'items' => array(
|
|
'type' => 'object',
|
|
'properties' => array(
|
|
'id' => array(
|
|
'description' => __( 'File MD5 hash.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'name' => array(
|
|
'description' => __( 'File name.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'file' => array(
|
|
'description' => __( 'File URL.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
'download_limit' => array(
|
|
'description' => __( 'Amount of times the product can be downloaded.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'default' => -1,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'download_expiry' => array(
|
|
'description' => __( 'Number of days that the customer has up to be able to download the product.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'default' => -1,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'download_type' => array(
|
|
'description' => __( 'Download type, this controls the schema on the front-end.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'default' => 'standard',
|
|
'enum' => array( 'standard' ),
|
|
'context' => array( 'view' ),
|
|
),
|
|
'external_url' => array(
|
|
'description' => __( 'Product external URL. Only for external products.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'format' => 'uri',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'button_text' => array(
|
|
'description' => __( 'Product external button text. Only for external products.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'tax_status' => array(
|
|
'description' => __( 'Tax status.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'default' => 'taxable',
|
|
'enum' => array( 'taxable', 'shipping', 'none' ),
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'tax_class' => array(
|
|
'description' => __( 'Tax class.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'manage_stock' => array(
|
|
'description' => __( 'Stock management at product level.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'stock_quantity' => array(
|
|
'description' => __( 'Stock quantity.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'in_stock' => array(
|
|
'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => true,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'backorders' => array(
|
|
'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'default' => 'no',
|
|
'enum' => array( 'no', 'notify', 'yes' ),
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'backorders_allowed' => array(
|
|
'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'backordered' => array(
|
|
'description' => __( 'Shows if the product is on backordered.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'sold_individually' => array(
|
|
'description' => __( 'Allow one item to be bought in a single order.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'weight' => array(
|
|
/* translators: %s: weight unit */
|
|
'description' => sprintf( __( 'Product weight (%s).', 'woocommerce' ), $weight_unit ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'dimensions' => array(
|
|
'description' => __( 'Product dimensions.', 'woocommerce' ),
|
|
'type' => 'object',
|
|
'context' => array( 'view', 'edit' ),
|
|
'properties' => array(
|
|
'length' => array(
|
|
/* translators: %s: dimension unit */
|
|
'description' => sprintf( __( 'Product length (%s).', 'woocommerce' ), $dimension_unit ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'width' => array(
|
|
/* translators: %s: dimension unit */
|
|
'description' => sprintf( __( 'Product width (%s).', 'woocommerce' ), $dimension_unit ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'height' => array(
|
|
/* translators: %s: dimension unit */
|
|
'description' => sprintf( __( 'Product height (%s).', 'woocommerce' ), $dimension_unit ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
),
|
|
),
|
|
'shipping_required' => array(
|
|
'description' => __( 'Shows if the product need to be shipped.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'shipping_taxable' => array(
|
|
'description' => __( 'Shows whether or not the product shipping is taxable.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'shipping_class' => array(
|
|
'description' => __( 'Shipping class slug.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'shipping_class_id' => array(
|
|
'description' => __( 'Shipping class ID.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'reviews_allowed' => array(
|
|
'description' => __( 'Allow reviews.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => true,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'average_rating' => array(
|
|
'description' => __( 'Reviews average rating.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'rating_count' => array(
|
|
'description' => __( 'Amount of reviews that the product have.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'related_ids' => array(
|
|
'description' => __( 'List of related products IDs.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'items' => array(
|
|
'type' => 'integer',
|
|
),
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'upsell_ids' => array(
|
|
'description' => __( 'List of up-sell products IDs.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'items' => array(
|
|
'type' => 'integer',
|
|
),
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'cross_sell_ids' => array(
|
|
'description' => __( 'List of cross-sell products IDs.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'items' => array(
|
|
'type' => 'integer',
|
|
),
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'parent_id' => array(
|
|
'description' => __( 'Product parent ID.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'purchase_note' => array(
|
|
'description' => __( 'Optional note to send the customer after purchase.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'categories' => array(
|
|
'description' => __( 'List of categories.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'context' => array( 'view', 'edit' ),
|
|
'items' => array(
|
|
'type' => 'object',
|
|
'properties' => array(
|
|
'id' => array(
|
|
'description' => __( 'Category ID.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'name' => array(
|
|
'description' => __( 'Category name.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'slug' => array(
|
|
'description' => __( 'Category slug.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
'tags' => array(
|
|
'description' => __( 'List of tags.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'context' => array( 'view', 'edit' ),
|
|
'items' => array(
|
|
'type' => 'object',
|
|
'properties' => array(
|
|
'id' => array(
|
|
'description' => __( 'Tag ID.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'name' => array(
|
|
'description' => __( 'Tag name.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'slug' => array(
|
|
'description' => __( 'Tag slug.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
'images' => array(
|
|
'description' => __( 'List of images.', 'woocommerce' ),
|
|
'type' => 'object',
|
|
'context' => array( 'view', 'edit' ),
|
|
'items' => array(
|
|
'type' => 'object',
|
|
'properties' => array(
|
|
'id' => array(
|
|
'description' => __( 'Image ID.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'date_created' => array(
|
|
'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ),
|
|
'type' => 'date-time',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'date_modified' => array(
|
|
'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ),
|
|
'type' => 'date-time',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'src' => array(
|
|
'description' => __( 'Image URL.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'format' => 'uri',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'name' => array(
|
|
'description' => __( 'Image name.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'alt' => array(
|
|
'description' => __( 'Image alternative text.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'position' => array(
|
|
'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
'attributes' => array(
|
|
'description' => __( 'List of attributes.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'context' => array( 'view', 'edit' ),
|
|
'items' => array(
|
|
'type' => 'object',
|
|
'properties' => array(
|
|
'id' => array(
|
|
'description' => __( 'Attribute ID.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'name' => array(
|
|
'description' => __( 'Attribute name.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'position' => array(
|
|
'description' => __( 'Attribute position.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'visible' => array(
|
|
'description' => __( "Define if the attribute is visible on the \"Additional information\" tab in the product's page.", 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'variation' => array(
|
|
'description' => __( 'Define if the attribute can be used as variation.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'default' => false,
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'options' => array(
|
|
'description' => __( 'List of available term names of the attribute.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
'default_attributes' => array(
|
|
'description' => __( 'Defaults variation attributes.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'context' => array( 'view', 'edit' ),
|
|
'items' => array(
|
|
'type' => 'object',
|
|
'properties' => array(
|
|
'id' => array(
|
|
'description' => __( 'Attribute ID.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'name' => array(
|
|
'description' => __( 'Attribute name.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'option' => array(
|
|
'description' => __( 'Selected attribute term name.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
'variations' => array(
|
|
'description' => __( 'List of variations IDs.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'context' => array( 'view' ),
|
|
'items' => array(
|
|
'type' => 'integer',
|
|
),
|
|
'readonly' => true,
|
|
),
|
|
'grouped_products' => array(
|
|
'description' => __( 'List of grouped products ID.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'items' => array(
|
|
'type' => 'integer',
|
|
),
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'menu_order' => array(
|
|
'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'meta_data' => array(
|
|
'description' => __( 'Meta data.', 'woocommerce' ),
|
|
'type' => 'array',
|
|
'context' => array( 'view', 'edit' ),
|
|
'items' => array(
|
|
'type' => 'object',
|
|
'properties' => array(
|
|
'id' => array(
|
|
'description' => __( 'Meta ID.', 'woocommerce' ),
|
|
'type' => 'integer',
|
|
'context' => array( 'view', 'edit' ),
|
|
'readonly' => true,
|
|
),
|
|
'key' => array(
|
|
'description' => __( 'Meta key.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
'value' => array(
|
|
'description' => __( 'Meta value.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'context' => array( 'view', 'edit' ),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
return $this->add_additional_fields_schema( $schema );
|
|
}
|
|
|
|
/**
|
|
* Get the query params for collections of attachments.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_collection_params() {
|
|
$params = parent::get_collection_params();
|
|
|
|
$params['slug'] = array(
|
|
'description' => __( 'Limit result set to products with a specific slug.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['status'] = array(
|
|
'default' => 'any',
|
|
'description' => __( 'Limit result set to products assigned a specific status.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'enum' => array_merge( array( 'any' ), array_keys( get_post_statuses() ) ),
|
|
'sanitize_callback' => 'sanitize_key',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['type'] = array(
|
|
'description' => __( 'Limit result set to products assigned a specific type.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'enum' => array_keys( wc_get_product_types() ),
|
|
'sanitize_callback' => 'sanitize_key',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['sku'] = array(
|
|
'description' => __( 'Limit result set to products with a specific SKU.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['featured'] = array(
|
|
'description' => __( 'Limit result set to featured products.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'sanitize_callback' => 'wc_string_to_bool',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['category'] = array(
|
|
'description' => __( 'Limit result set to products assigned a specific category ID.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'wp_parse_id_list',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['tag'] = array(
|
|
'description' => __( 'Limit result set to products assigned a specific tag ID.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'wp_parse_id_list',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['shipping_class'] = array(
|
|
'description' => __( 'Limit result set to products assigned a specific shipping class ID.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'wp_parse_id_list',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['attribute'] = array(
|
|
'description' => __( 'Limit result set to products with a specific attribute.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['attribute_term'] = array(
|
|
'description' => __( 'Limit result set to products with a specific attribute term ID (required an assigned attribute).', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'wp_parse_id_list',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
|
|
if ( wc_tax_enabled() ) {
|
|
$params['tax_class'] = array(
|
|
'description' => __( 'Limit result set to products with a specific tax class.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'enum' => array_merge( array( 'standard' ), WC_Tax::get_tax_class_slugs() ),
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
}
|
|
|
|
$params['in_stock'] = array(
|
|
'description' => __( 'Limit result set to products in stock or out of stock.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'sanitize_callback' => 'wc_string_to_bool',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['on_sale'] = array(
|
|
'description' => __( 'Limit result set to products on sale.', 'woocommerce' ),
|
|
'type' => 'boolean',
|
|
'sanitize_callback' => 'wc_string_to_bool',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['min_price'] = array(
|
|
'description' => __( 'Limit result set to products based on a minimum price.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
$params['max_price'] = array(
|
|
'description' => __( 'Limit result set to products based on a maximum price.', 'woocommerce' ),
|
|
'type' => 'string',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'validate_callback' => 'rest_validate_request_arg',
|
|
);
|
|
|
|
return $params;
|
|
}
|
|
}
|