Automattic\WooCommerce\Internal\CLI\Migrator\Platforms\Webflow

WebflowMapper::map_variable_dataprivateWC 1.0

Map variable-product data: attribute definitions + per-variation rows.

Method of the class: WebflowMapper{}

No Hooks.

Returns

Array{attributes:. array, variations: array}

Usage

// private - for code of main (parent) class only
$result = $this->map_variable_data( $properties, $skus, $images ): array;
$properties(array<int,object>) (required)
sku-properties array.
$skus(array<int,object>) (required)
SKUs array.
$images(array<int,array>) (required)
Already-built images list (to resolve image references).

WebflowMapper::map_variable_data() code WC 11.0.0

private function map_variable_data( array $properties, array $skus, array $images ): array {
	$attributes = array();

	// Build a lookup: property_id => [ 'name' => string, 'enums' => [ enum_id => option_name ] ].
	$property_lookup = array();
	$position        = 0;
	foreach ( $properties as $property ) {
		if ( ! is_object( $property ) || empty( $property->id ) || empty( $property->name ) ) {
			continue;
		}

		$enum_map     = array();
		$enum_options = array();
		$enums        = ( isset( $property->enum ) && is_array( $property->enum ) ) ? $property->enum : array();

		foreach ( $enums as $enum ) {
			if ( ! is_object( $enum ) || empty( $enum->id ) || empty( $enum->name ) ) {
				continue;
			}
			$enum_map[ (string) $enum->id ] = (string) $enum->name;
			$enum_options[]                 = (string) $enum->name;
		}

		$property_lookup[ (string) $property->id ] = array(
			'name'  => (string) $property->name,
			'enums' => $enum_map,
		);

		if ( $this->should_process( 'attributes' ) ) {
			$attributes[] = array(
				'name'         => wc_clean( (string) $property->name ),
				'options'      => array_map( 'wc_clean', $enum_options ),
				'position'     => $position,
				'is_visible'   => true,
				'is_variation' => true,
			);
		}

		++$position;
	}

	// Build URL => original_id map so we can resolve a SKU's main-image back to an entry in images[].
	$url_to_original_id = array();
	foreach ( $images as $image ) {
		$url_to_original_id[ $image['src'] ] = $image['original_id'];
	}

	$variations = array();
	$menu_order = 0;
	foreach ( $skus as $sku ) {
		$sku_field = isset( $sku->fieldData ) && is_object( $sku->fieldData ) ? $sku->fieldData : null; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase -- Webflow API uses camelCase.
		if ( null === $sku_field ) {
			continue;
		}

		$variation = array(
			'original_id'       => isset( $sku->id ) ? (string) $sku->id : null,
			'sku'               => null,
			'regular_price'     => null,
			'sale_price'        => null,
			'manage_stock'      => false,
			'stock_quantity'    => null,
			'stock_status'      => 'instock',
			'tax_status'        => 'taxable',
			'attributes'        => array(),
			'image_original_id' => null,
			'menu_order'        => $menu_order,
		);

		if ( $this->should_process( 'sku' ) && isset( $sku_field->sku ) ) {
			$variation['sku'] = wc_clean( (string) $sku_field->sku );
		}

		if ( $this->should_process( 'price' ) ) {
			$prices                     = $this->extract_prices( $sku_field );
			$variation['regular_price'] = $prices['regular_price'];
			$variation['sale_price']    = $prices['sale_price'];
		}

		if ( $this->should_process( 'stock' ) ) {
			$stock                       = $this->extract_stock( $sku_field );
			$variation['manage_stock']   = $stock['manage_stock'];
			$variation['stock_quantity'] = $stock['stock_quantity'];
			$variation['stock_status']   = $stock['stock_status'];
		}

		if ( $this->should_process( 'weight' ) ) {
			$variation['weight'] = $this->extract_weight( $sku_field );
		}

		if ( $this->should_process( 'dimensions' ) ) {
			$variation = array_merge( $variation, $this->extract_dimensions( $sku_field ) );
		}

		if ( $this->should_process( 'attributes' ) ) {
			$variation['attributes'] = $this->resolve_variation_attributes( $sku_field, $property_lookup );
			if ( empty( $variation['attributes'] ) ) {
				wc_get_logger()->debug(
					sprintf(
						'Webflow variation %s resolved to zero attributes; WooCommerce will store it as an "Any" variation, which can collide with sibling variations.',
						$variation['original_id'] ?? 'unknown'
					),
					array( 'source' => 'wc-migrator' )
				);
			}
		}

		if ( $this->should_process( 'images' ) ) {
			$main_image_key = 'main-image';
			if ( isset( $sku_field->{$main_image_key}->url ) ) {
				$url = (string) $sku_field->{$main_image_key}->url;
				if ( isset( $url_to_original_id[ $url ] ) ) {
					$variation['image_original_id'] = $url_to_original_id[ $url ];
				}
			}
		}

		$variations[] = $variation;
		++$menu_order;
	}

	return array(
		'attributes' => $attributes,
		'variations' => $variations,
	);
}