Automattic\WooCommerce\StoreApi\Utilities
CartController::parse_variation_data
If variations are set, validate and format the values ready to add to the cart.
Method of the class: CartController{}
No Hooks.
Returns
Array. Updated request array.
Usage
// protected - for code of main (parent) or child class $result = $this->parse_variation_data( $request );
- $request(array) (required)
- Add to cart request params.
CartController::parse_variation_data() CartController::parse variation data code WC 10.3.6
protected function parse_variation_data( $request ) {
$product = $this->get_product_for_cart( $request );
// Remove variation request if not needed.
if ( ! $product->is_type( array( ProductType::VARIATION, ProductType::VARIABLE ) ) ) {
$request['variation'] = [];
return $request;
}
// Flatten data and format posted values.
$variable_product_attributes = $this->get_variable_product_attributes( $product );
$request['variation'] = $this->sanitize_variation_data( wp_list_pluck( $request['variation'], 'value', 'attribute' ), $variable_product_attributes );
// If we have a parent product, find the variation ID.
if ( $product->is_type( ProductType::VARIABLE ) ) {
$request['id'] = $this->get_variation_id_from_variation_data( $request, $product );
}
// Now we have a variation ID, get the valid set of attributes for this variation. They will have an attribute_ prefix since they are from meta.
$expected_attributes = wc_get_product_variation_attributes( $request['id'] );
$missing_attributes = [];
foreach ( $variable_product_attributes as $attribute ) {
if ( ! $attribute['is_variation'] ) {
continue;
}
$prefixed_attribute_name = 'attribute_' . sanitize_title( $attribute['name'] );
$expected_value = isset( $expected_attributes[ $prefixed_attribute_name ] ) ? $expected_attributes[ $prefixed_attribute_name ] : '';
$attribute_label = wc_attribute_label( $attribute['name'] );
if ( isset( $request['variation'][ wc_variation_attribute_name( $attribute['name'] ) ] ) ) {
$given_value = $request['variation'][ wc_variation_attribute_name( $attribute['name'] ) ];
if ( $expected_value === $given_value ) {
continue;
}
// If valid values are empty, this is an 'any' variation so get all possible values.
if ( '' === $expected_value && in_array( $given_value, $attribute->get_slugs(), true ) ) {
continue;
}
throw new RouteException(
'woocommerce_rest_invalid_variation_data',
sprintf(
/* translators: %1$s: Attribute name, %2$s: Allowed values. */
esc_html__( 'Invalid value posted for %1$s. Allowed values: %2$s', 'woocommerce' ),
esc_html( $attribute_label ),
esc_html( implode( ', ', $attribute->get_slugs() ) )
),
400
);
}
// Fills request array with unspecified attributes that have default values. This ensures the variation always has full data.
if ( '' !== $expected_value && ! isset( $request['variation'][ wc_variation_attribute_name( $attribute['name'] ) ] ) ) {
$request['variation'][ wc_variation_attribute_name( $attribute['name'] ) ] = $expected_value;
}
// If no attribute was posted, only error if the variation has an 'any' attribute which requires a value.
if ( '' === $expected_value ) {
$missing_attributes[] = $attribute_label;
}
}
if ( ! empty( $missing_attributes ) ) {
throw new RouteException(
'woocommerce_rest_missing_variation_data',
esc_html__( 'Missing variation data for variable product.', 'woocommerce' ) . ' ' .
esc_html(
sprintf(
/* translators: %s: Attribute name. */
_n(
'%s is a required field',
'%s are required fields',
count( $missing_attributes ),
'woocommerce'
),
wc_format_list_of_items( $missing_attributes )
)
),
400
);
}
ksort( $request['variation'] );
return $request;
}