How can I convert a product attribute type from Text to Select in the Magento Backend. Is there any in-built functionality or we need to write custom code for that?

I already have attribute values assigned for many products, so don't want to lose that in this conversion.


  • Can you explain in more detail what you are trying to do. Are you talking about an attribute in the backend? You want to migrate the attribute from a text value to a dropdown value without loosing the values already entered for the products? – Sander Mangel Aug 13 '13 at 13:51
  • yes exactly that. – Kalpesh Aug 13 '13 at 13:56
  • No built in functionality that I know of — I believe the Magento UI prevents you from changing this to avoid the complications that might arise from converting an attribute's type like that. – Alan Storm Aug 13 '13 at 19:47
  • @AlanStorm Hmm you are right. I am re-creating the attribute with dropdown type as Sander suggested. – Kalpesh Aug 13 '13 at 19:53

You would first need to have a script that stores all values per product in a CSV for example

$collection = Mage::getModel('catalog/product')

foreach ($collection as $product) {
    echo "{$product->getId()};{$product->getData('your-attribute')}\n";

executing this from the commandline php /path/to/script.php > values.csv will create a CSV with the ID's and attribute values.

Now the next step would be to remove the old attribute and create a new one with the text values as dropdown options.

Then we need to import those values again retrieving the option ID from the value which should now be the admin label


$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 'your-attribute'); 

$attribute_source = Mage::getModel('eav/entity_attribute_source_abstract');

if (($handle = fopen("your-csv-file.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        list($_id, $_value) = $data;

        $product = Mage::getModel('catalog/product')->load($_id);
        $product->setData('your-attribute', $attribute_source->getOptionId($_value));

        try {
        } catch(Exception $e) {
            echo "{$_id}: {$e}";


This code is untested so please don't use it in a production environment. Let me know if it worked for you.

| improve this answer | |
  • Thanks for help! There were things needed to be modified to get this to work. I have dedicated a post for this with detailed instructions on how to do it step-by-step here: ka.lpe.sh/2013/08/13/… – Kalpesh Aug 13 '13 at 23:26
  • Great you've worked it out, as I said the code was untested so I expected you needed to tweak it. Might I suggest providing a source with your article to help Magento Stackexchange grow? – Sander Mangel Aug 14 '13 at 7:03
  • 1
    Given link at the end of the post :) – Kalpesh Aug 14 '13 at 15:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.