Programmatically create a configurable Magento product

configurable-programmatically-featured

I already wrote about creating a simple product programmatically in Magento. For configurable product, however, things get a little bit complicated.

As you already know, a configurable product is merely a product with simple products that differ in some option (attribute) assigned to itself.

We can use this conclusion to extend our code for creation of simple products to work with configurable.

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$simpleProduct = Mage::getModel('catalog/product');
try {
$simpleProduct
//    ->setStoreId(1) //you can set data in store scope
    ->setWebsiteIds(array(1)) //website ID the product is assigned to, as an array
    ->setAttributeSetId(20) //ID of a attribute set named 'default'
    ->setTypeId('simple') //product type
    ->setCreatedAt(strtotime('now')) //product creation time
//    ->setUpdatedAt(strtotime('now')) //product update time
    ->setSku('simple99y') //SKU
    ->setName('test simple product99') //product name
    ->setWeight(4.0000)
    ->setStatus(1) //product status (1 - enabled, 2 - disabled)
    ->setTaxClassId(4) //tax class (0 - none, 1 - default, 2 - taxable, 4 - shipping)
    ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) //catalog and search visibility
    ->setManufacturer(28) //manufacturer id
    ->setColor(24)
    ->setNewsFromDate('06/26/2014') //product set as new from
    ->setNewsToDate('06/30/2014') //product set as new to
    ->setCountryOfManufacture('AF') //country of manufacture (2-letter country code)
    ->setPrice(11.22) //price in form 11.22
    ->setCost(22.33) //price in form 11.22
    ->setSpecialPrice(00.44) //special price in form 11.22
    ->setSpecialFromDate('06/1/2014') //special price from (MM-DD-YYYY)
    ->setSpecialToDate('06/30/2014') //special price to (MM-DD-YYYY)
    ->setMsrpEnabled(1) //enable MAP
    ->setMsrpDisplayActualPriceType(1) //display actual price (1 - on gesture, 2 - in cart, 3 - before order confirmation, 4 - use config)
    ->setMsrp(99.99) //Manufacturer's Suggested Retail Price
    ->setMetaTitle('test meta title 2')
    ->setMetaKeyword('test meta keyword 2')
    ->setMetaDescription('test meta description 2')
    ->setDescription('This is a long description')
    ->setShortDescription('This is a short description')
    ->setMediaGallery(array('images' => array(), 'values' => array())) //media gallery initialization
    ->setStockData(array(
            'use_config_manage_stock' => 0, //'Use config settings' checkbox
            'manage_stock' => 1, //manage stock
            'min_sale_qty' => 1, //Minimum Qty Allowed in Shopping Cart
            'max_sale_qty' => 2, //Maximum Qty Allowed in Shopping Cart
            'is_in_stock' => 1, //Stock Availability
            'qty' => 999 //qty
        )
    )
    ->setCategoryIds(array(3, 10)); //assign product to categories
    $simpleProduct->save();
} catch (Exception $e) {
    Mage::log($e->getMessage());
    echo $e->getMessage();
}

The code above would create a simple product. I won’t go into the details, but if you want, you can read more on my previous article by clicking on the link written at the top.

What we need to do now is create a configurable product and assign this simple product to it.

$configProduct = Mage::getModel('catalog/product');,
try {
$configProduct
//    ->setStoreId(1) //you can set data in store scope
        ->setWebsiteIds(array(1)) //website ID the product is assigned to, as an array
        ->setAttributeSetId(20) //ID of a attribute set named 'default'
        ->setTypeId('configurable') //product type
        ->setCreatedAt(strtotime('now')) //product creation time
//    ->setUpdatedAt(strtotime('now')) //product update time
        ->setSku('configurable96') //SKU
        ->setName('test config product96') //product name
        ->setWeight(4.0000)
        ->setStatus(1) //product status (1 - enabled, 2 - disabled)
        ->setTaxClassId(4) //tax class (0 - none, 1 - default, 2 - taxable, 4 - shipping)
        ->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) //catalog and search visibility
        ->setManufacturer(28) //manufacturer id
        ->setNewsFromDate('06/26/2014') //product set as new from
        ->setNewsToDate('06/30/2014') //product set as new to
        ->setCountryOfManufacture('AF') //country of manufacture (2-letter country code)
        ->setPrice(11.22) //price in form 11.22
        ->setCost(22.33) //price in form 11.22
        ->setSpecialPrice(00.44) //special price in form 11.22
        ->setSpecialFromDate('06/1/2014') //special price from (MM-DD-YYYY)
        ->setSpecialToDate('06/30/2014') //special price to (MM-DD-YYYY)
        ->setMsrpEnabled(1) //enable MAP
        ->setMsrpDisplayActualPriceType(1) //display actual price (1 - on gesture, 2 - in cart, 3 - before order confirmation, 4 - use config)
        ->setMsrp(99.99) //Manufacturer's Suggested Retail Price
        ->setMetaTitle('test meta title 2')
        ->setMetaKeyword('test meta keyword 2')
        ->setMetaDescription('test meta description 2')
        ->setDescription('This is a long description')
        ->setShortDescription('This is a short description')
        ->setMediaGallery(array('images' => array(), 'values' => array())) //media gallery initialization
        ->setStockData(array(
                'use_config_manage_stock' => 0, //'Use config settings' checkbox
                'manage_stock' => 1, //manage stock
                'is_in_stock' => 1, //Stock Availability
            )
        )
        ->setCategoryIds(array(3, 10)) //assign product to categories
    ;
    /**/
    /** assigning associated product to configurable */
    /**/
    $configProduct->getTypeInstance()->setUsedProductAttributeIds(array(92)); //attribute ID of attribute 'color' in my store
    $configurableAttributesData = $configProduct->getTypeInstance()->getConfigurableAttributesAsArray();
 
    $configProduct->setCanSaveConfigurableAttributes(true);
    $configProduct->setConfigurableAttributesData($configurableAttributesData);
 
    $configurableProductsData = array();
    $configurableProductsData['920'] = array( //['920'] = id of a simple product associated with this configurable
        '0' => array(
            'label' => 'Green', //attribute label
            'attribute_id' => '92', //attribute ID of attribute 'color' in my store
            'value_index' => '24', //value of 'Green' index of the attribute 'color'
            'is_percent' => '0', //fixed/percent price for this option
            'pricing_value' => '21' //value for the pricing
        )
    );
    $configProduct->setConfigurableProductsData($configurableProductsData);
    $configProduct->save();
 
    echo 'success';
} catch (Exception $e) {
    Mage::log($e->getMessage());
    echo $e->getMessage();
}

And that’s it! Your configurable product should be properly set up and visible on the frontend!

Note that you need to assign the same attribute set to both configurable product and it’s associated products.

In the code comments you’ll find a short comment for each of the methods used. As in previous article, you can log the saveAction of Mage_Adminhtml_Catalog_ProductController to get list of all the data keys you can add for the product.

Need help following the code in this article? Leave a comment below.


16 comments

  1. The configurable product is created, I can see it in the product grid, but when trying to edit it, it would ask me what configurable attributes to used, the same as the fist step when creating a configurable product from the product management.

  2. Hi. this code is work well..but when page load it automatically create a product. what i need is when i click add button after that create a product. i wrote onclick function in button field but its not work. how it fixed

  3. hello,
    i try this code, its work very nice, but pricing_value not working.
    please help.

  4. Hi i am getting error

    Fatal error: Uncaught exception ‘Mage_Core_Exception’ with message ‘The product could not be found.’ in /public_html/clients/preptable/app/Mage.php:595 Stack trace: #0 /public_html/clients/preptable/app/code/core/Mage/Checkout/Model/Cart.php(211): Mage::throwException(‘The product cou…’) #1 /public_html/clients/preptable/app/code/core/Mage/Checkout/Model/Cart.php(248): Mage_Checkout_Model_Cart->_getProduct(Object(Mage_Catalog_Model_Product)) #2 /public_html/clients/preptable/product1.php(40): Mage_Checkout_Model_Cart->addProduct(Object(Mage_Catalog_Model_Product), Object(Varien_Object)) #3 {main} thrown in /public_html/clients/preptable/app/Mage.php on line 595

    I have added a product by code in magento 1.9 then i am trying to add same product into cart, it shows this error, but if i go into admin and then save that product again then add same product into cart by code, it works, so the problem is when i add product in magento by code and then in next line i add it in cart using below code it shows this error.

    $session = Mage::getSingleton(‘customer/session’);
    $cart = Mage::getSingleton(‘checkout/cart’);

    $cart->init();
    //Mage::getSingleton(‘checkout/cart’)->truncate();
    $productInstance = Mage::getModel(‘catalog/product’)->load($productId);
    $params = array(
    ‘product’ => $productInstance->getId(),
    ‘qty’ => 1,
    ‘options’ => $optionvalue
    );

    $request = new Varien_Object();
    $request->setData($params);
    $cart->addProduct($productInstance, $request);
    $session->setCartWasUpdated(true);
    $cart->save();

    Any help would be really apprecitaed i have tried a lot of codes but none of them seems to be working.

  5. i want show default price in configureable product
    there are 4 simple product in 1 configureable product
    please help me out how to show default price

    1. first, there must be 4 associated product (4 simple product) with 1 configurable product in your case, that 4 associated product will must contain your default product if not add it via create and then price it. Your default product price will be shown to your store.

  6. hi. this one is very helpful. i will derive from your code and create a simple library to easily create configurable product. will share this here as soon as i’m done. thank you very much for posting this. pretty weird that the standard Magento APi didn’t support this up till now. (using CE and the madison island to check stuff).

  7. i want show default price in configureable product
    there are 4 simple product in 1 configureable product
    please me help out how to show default price

  8. i always get “Fatal error: Call to a member function getTypeInstance() on a non-object” on the line where i
    use: $configurableAttributesData = $configProduct->getTypeInstance()->getConfigurableAttributesAsArray();

    1. I always get “Fatal error: Call to a member function getTypeInstance() on a non-object” on the line where i
      use: $configurableAttributesData = $configProduct->getTypeInstance()->getConfigurableAttributesAsArray();” with your code. When I debug the code, $configurableAttributesData doesn’t return the attributes had been assigned to be configurable. Please help! Thanks.

  9. Awesome thnx, but for me its working without this line of code,dont know why

    $configurableAttributesData = $configProduct->getTypeInstance()->getConfigurableAttributesAsArray();

  10. I was wondering about displaying simple product price when setting up a configurable product? Magento allows you to add or subtract but that might get confusing.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <blockquote cite=""> <code> <del datetime=""> <em> <s> <strike> <strong>. You may use following syntax for source code: <pre><code>$current = "Inchoo";</code></pre>.