Automattic\WooCommerce\Internal\CLI\Migrator\Core

WooCommerceProductImporter::import_productpublicWC 1.0

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() 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 );
	}
}