Automattic\WooCommerce\StoreApi\Utilities

CartController::parse_variation_data()protectedWC 1.0

If variations are set, validate and format the values ready to add to the cart.

Метод класса: CartController{}

Хуков нет.

Возвращает

Массив. Updated request array.

Использование

// protected - в коде основоного (родительского) или дочернего класса
$result = $this->parse_variation_data( $request );
$request(массив) (обязательный)
Add to cart request params.

Код CartController::parse_variation_data() WC 8.7.0

protected function parse_variation_data( $request ) {
	$product = $this->get_product_for_cart( $request );

	// Remove variation request if not needed.
	if ( ! $product->is_type( array( 'variation', '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( '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',
				/* translators: %1$s: Attribute name, %2$s: Allowed values. */
				sprintf( __( 'Invalid value posted for %1$s. Allowed values: %2$s', 'woocommerce' ), $attribute_label, 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',
			/* translators: %s: Attribute name. */
			__( 'Missing variation data for variable product.', 'woocommerce' ) . ' ' . sprintf( _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;
}