reinitialize(); require __DIR__ . '/configurable_attribute.php'; /** @var ProductRepositoryInterface $productRepository */ $productRepository = Bootstrap::getObjectManager() ->create(ProductRepositoryInterface::class); /** @var $installer CategorySetup */ $installer = Bootstrap::getObjectManager()->create(CategorySetup::class); /* Create simple products per each option value*/ /** @var AttributeOptionInterface[] $options */ $options = $attribute->getOptions(); $attributeValues = []; $attributeSetId = $installer->getAttributeSetId('catalog_product', 'Default'); $associatedProductIds = []; $productIds = [10, 20]; array_shift($options); //remove the first option which is empty foreach ($options as $option) { /** @var $product Product */ $product = Bootstrap::getObjectManager()->create(Product::class); $productId = array_shift($productIds); $product->setTypeId(Type::TYPE_SIMPLE) ->setId($productId) ->setAttributeSetId($attributeSetId) ->setWebsiteIds([1]) ->setName('Configurable Option' . $option->getLabel()) ->setSku('simple_' . $productId) ->setPrice($productId) ->setTestConfigurable($option->getValue()) ->setVisibility(Visibility::VISIBILITY_NOT_VISIBLE) ->setStatus(Status::STATUS_ENABLED) ->setStockData(['use_config_manage_stock' => 1, 'qty' => 100, 'is_qty_decimal' => 0, 'is_in_stock' => 1]); $product = $productRepository->save($product); /** @var \Magento\CatalogInventory\Model\Stock\Item $stockItem */ $stockItem = Bootstrap::getObjectManager()->create('Magento\CatalogInventory\Model\Stock\Item'); $stockItem->load($productId, 'product_id'); if (!$stockItem->getProductId()) { $stockItem->setProductId($productId); } $stockItem->setUseConfigManageStock(1); $stockItem->setQty(1000); $stockItem->setIsQtyDecimal(0); $stockItem->setIsInStock(1); $stockItem->save(); $attributeValues[] = [ 'label' => 'test', 'attribute_id' => $attribute->getId(), 'value_index' => $option->getValue(), ]; $associatedProductIds[] = $product->getId(); } /** @var $product Product */ $product = Bootstrap::getObjectManager()->create(Product::class); /** @var Factory $optionsFactory */ $optionsFactory = Bootstrap::getObjectManager()->create(Factory::class); $configurableAttributesData = [ [ 'attribute_id' => $attribute->getId(), 'code' => $attribute->getAttributeCode(), 'label' => $attribute->getStoreLabel(), 'position' => '0', 'values' => $attributeValues, ], ]; $configurableOptions = $optionsFactory->create($configurableAttributesData); $extensionConfigurableAttributes = $product->getExtensionAttributes(); $extensionConfigurableAttributes->setConfigurableProductOptions($configurableOptions); $extensionConfigurableAttributes->setConfigurableProductLinks($associatedProductIds); $product->setExtensionAttributes($extensionConfigurableAttributes); // Remove any previously created product with the same id. /** @var \Magento\Framework\Registry $registry */ $registry = Bootstrap::getObjectManager()->get('Magento\Framework\Registry'); $registry->unregister('isSecureArea'); $registry->register('isSecureArea', true); try { $productToDelete = $productRepository->getById(1); $productRepository->delete($productToDelete); } catch (\Exception $e) { // Nothing to remove } $registry->unregister('isSecureArea'); $registry->register('isSecureArea', false); $product->setTypeId(Configurable::TYPE_CODE) ->setId(1) ->setAttributeSetId($attributeSetId) ->setWebsiteIds([1]) ->setName('Configurable Product') ->setSku('configurable') ->setVisibility(Visibility::VISIBILITY_BOTH) ->setStatus(Status::STATUS_ENABLED) ->setStockData(['use_config_manage_stock' => 1, 'is_in_stock' => 1]); $productRepository->save($product);