Automattic\WooCommerce\Internal\CLI\Migrator\Core
WooCommerceProductImporter::import_product
Import a single product from mapped data.
Method of the class: WooCommerceProductImporter{}
No Hooks.
Returns
Array. Import result with status and details.
Usage
$WooCommerceProductImporter = new WooCommerceProductImporter(); $WooCommerceProductImporter->import_product( $product_data, $source_data ): array;
- $product_data(array) (required)
- Mapped WooCommerce product data.
- $source_data(array)
- Original source platform data for reference.
Default:array()
WooCommerceProductImporter::import_product() WooCommerceProductImporter::import product code WC 10.7.0
public function import_product( array $product_data, array $source_data = array() ): array {
$start_time = microtime( true );
$product_name = $product_data['name'] ?? 'Unknown Product';
$this->current_attribute_mapping = array();
try {
wc_get_logger()->info( "Starting import for product: {$product_name}", array( 'source' => 'wc-migrator' ) );
$validation_result = $this->validate_product_data( $product_data );
if ( ! $validation_result['valid'] ) {
wc_get_logger()->error( "Validation failed for product: {$product_name} - " . $validation_result['message'], array( 'source' => 'wc-migrator' ) );
return $this->create_error_result( 'validation_failed', $validation_result['message'], $product_data );
}
$existing_product_id = $this->find_existing_product( $product_data, $source_data );
if ( $existing_product_id && $this->import_options['skip_existing'] ) {
++$this->import_stats['products_skipped'];
return $this->create_success_result( 'skipped', $existing_product_id, 'Product already exists and skip_existing is enabled' );
}
$product_type = $this->determine_product_type( $product_data );
$product = $this->get_or_create_product_object( $existing_product_id, $product_type );
if ( ! $product ) {
return $this->create_error_result( 'product_creation_failed', 'Failed to create product object', $product_data );
}
if ( $existing_product_id ) {
$existing_migration_data = $product->get_meta( '_migration_data' );
if ( is_array( $existing_migration_data ) ) {
$this->migration_data['images_mapping'] = $existing_migration_data['images_mapping'] ?? array();
$this->migration_data['variations_mapping'] = $existing_migration_data['variations_mapping'] ?? array();
}
}
$this->set_basic_product_properties( $product, $product_data );
$this->set_product_taxonomies( $product, $product_data );
$this->handle_product_images( $product, $product_data['images'] ?? array() );
wc_get_logger()->debug( "Processing {$product_type} product: {$product_name}", array( 'source' => 'wc-migrator' ) );
switch ( $product_type ) {
case 'variable':
$this->handle_variable_product( $product, $product_data );
break;
case 'simple':
default:
$this->handle_simple_product( $product, $product_data );
break;
}
$product_id = $product->save();
if ( ! $product_id ) {
return $this->create_error_result( 'save_failed', 'Failed to save product to database', $product_data );
}
$this->handle_post_save_operations( $product_id, $product_data, $source_data );
if ( $existing_product_id ) {
++$this->import_stats['products_updated'];
} else {
++$this->import_stats['products_created'];
}
$duration = microtime( true ) - $start_time;
$action = $existing_product_id ? 'updated' : 'created';
wc_get_logger()->info(
"Successfully {$action} product: {$product_name} (ID: {$product_id}) in {$duration}s",
array( 'source' => 'wc-migrator' )
);
return $this->create_success_result( $action, $product_id, "Product {$action} successfully in {$duration}s" );
} catch ( Exception $e ) {
++$this->import_stats['errors_encountered'];
$duration = microtime( true ) - $start_time;
wc_get_logger()->error(
"Exception importing product: {$product_name} after {$duration}s - " . $e->getMessage(),
array(
'source' => 'wc-migrator',
'exception' => $e,
)
);
return $this->create_error_result( 'exception', $e->getMessage(), $product_data );
}
}