Automattic\WooCommerce\Internal\CLI\Migrator\Platforms\Webflow
WebflowMapper::map_variable_data │ private │ WC 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() 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,
);
}