'style' => true, 'id' => true, 'class' => true, ), ), wp_kses_allowed_html( 'post' ) ) ); } /** * Add meta query. * * @since 3.0.0 * @param array $args Query args. * @param array $meta_query Meta query. * @return array */ protected function add_meta_query( $args, $meta_query ) { if ( empty( $args['meta_query'] ) ) { $args['meta_query'] = array(); } $args['meta_query'][] = $meta_query; return $args['meta_query']; } /** * Get the batch schema, conforming to JSON Schema. * * @return array */ public function get_public_batch_schema() { $schema = array( '$schema' => 'http://json-schema.org/draft-04/schema#', 'title' => 'batch', 'type' => 'object', 'properties' => array( 'create' => array( 'description' => __( 'List of created resources.', 'woocommerce' ), 'type' => 'array', 'context' => array( 'view', 'edit' ), 'items' => array( 'type' => 'object', ), ), 'update' => array( 'description' => __( 'List of updated resources.', 'woocommerce' ), 'type' => 'array', 'context' => array( 'view', 'edit' ), 'items' => array( 'type' => 'object', ), ), 'delete' => array( 'description' => __( 'List of delete resources.', 'woocommerce' ), 'type' => 'array', 'context' => array( 'view', 'edit' ), 'items' => array( 'type' => 'integer', ), ), ), ); return $schema; } /** * 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. * * @since 3.5.0 * @param WP_REST_Request $request Full details about the request. * @return array Fields to be included in the response. */ 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; } /** * Limit the contents of the meta_data property based on certain request parameters. * * Note that if both `include_meta` and `exclude_meta` are present in the request, * `include_meta` will take precedence. * * @param \WP_REST_Request $request The request. * @param array $meta_data All of the meta data for an object. * * @return array */ protected function get_meta_data_for_response( $request, $meta_data ) { $fields = $this->get_fields_for_response( $request ); if ( ! in_array( 'meta_data', $fields, true ) ) { return array(); } $include = (array) $request['include_meta']; $exclude = (array) $request['exclude_meta']; if ( ! empty( $include ) ) { $meta_data = array_filter( $meta_data, function( WC_Meta_Data $item ) use ( $include ) { $data = $item->get_data(); return in_array( $data['key'], $include, true ); } ); } elseif ( ! empty( $exclude ) ) { $meta_data = array_filter( $meta_data, function( WC_Meta_Data $item ) use ( $exclude ) { $data = $item->get_data(); return ! in_array( $data['key'], $exclude, true ); } ); } // Ensure the array indexes are reset so it doesn't get converted to an object in JSON. return array_values( $meta_data ); } }