Esto es lo que me funciona para eliminar un atributo del producto configurable.
Este es el escenario.
Todos los productos configurables se crearon incorrectamente con el atributo brand
como un atributo configurable para aproximadamente 50 productos configurables que tienen aproximadamente 200 productos simples asociados.
Todos los productos simples asociados a un atributo configurable tienen la misma marca. La idea es eliminar brand
de los atributos configurables y asignarlo como un atributo simple al producto configurable con el valor de uno de los productos simples.
Aquí está el código que hace esto. El código se ejecuta solo una vez. Se puede agregar en un script de actualización o en un simple archivo php.
<?php
//==>this is required only if you use a simple php file
error_reporting(E_ALL | E_STRICT);
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
Mage::app();
//<==
$brand = 'brand';
//get the attribute instance
$brandAttribute = Mage::getModel('eav/config')->getAttribute('catalog_product', $brand);
//if this attribute exists
if ($brandAttribute->getId()){
//make the attribute apply to al types of products in case it's not
$brandAttribute->setApplyTo(null);
$brandAttribute->save();
$resource = Mage::getSingleton('core/resource');
//get an object with access to direct queries
$connection = $resource->getConnection('core_write');
//get all configurable products - you can specify additional filters here
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('type_id', 'configurable');
foreach ($collection as $product){
//the configurable attributes are stored in the table 'catalog_product_super_attribute'
//remove the attribute references from that table.
//The constraints will take care of the cleanup.
$q = "DELETE FROM {$resource->getTableName('catalog_product_super_attribute')}
WHERE attribute_id = {$brandAttribute->getId()} AND product_id = {$product->getId()}";
$connection->query($q);
//get the simple products in the configurable product
$usedProducts = $product->getTypeInstance(true)->getUsedProducts(null, $product);
foreach ($usedProducts as $p){
//identify the first simple product that has a value for brand
//set that value to the configurable product.
if ($brandValue = $p->getData($brand)){
Mage::getSingleton('catalog/product_action')
->updateAttributes(array($product->getId()), array($brand=>$brandValue), 0);
break;
}
}
}
}
Para los números enumerados anteriormente, esto tardó aproximadamente 15 segundos en ejecutarse en mi máquina local (no potente). Estoy seguro de que esto se puede optimizar. Lo más probable es que no sea necesario obtener todos los productos simples de un producto configurable para obtener el brand
valor, pero no me molesté.