Aqui está o que costuras para trabalhar para remover um atributo do produto configurável.
Este é o cenário.
Todos os produtos configuráveis foram criados incorretamente com o atributo brand
como atributo configurável para cerca de 50 produtos configuráveis com cerca de 200 produtos associados simples.
Todos os produtos simples associados a um atributo configurável têm a mesma marca. A idéia é remover brand
dos atributos configuráveis e atribuí-lo como um atributo simples ao produto configurável com o valor de um dos produtos simples.
Aqui está o código que faz isso. O código é executado apenas uma vez. Ele pode ser adicionado em um script de atualização ou em um arquivo php simples.
<?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 os números listados acima, demorou cerca de 15 segundos para executar na minha máquina local (não uma poderosa). Tenho certeza de que isso pode ser otimizado. Provavelmente, não há necessidade de obter todos os produtos simples de um produto configurável para obter o brand
valor, mas não me incomodei.