Inilah yang berfungsi bagi saya untuk menghapus atribut dari produk yang dapat dikonfigurasi.
Ini skenarionya.
Semua produk yang dapat dikonfigurasi dibuat salah dengan atribut brand
sebagai atribut yang dapat dikonfigurasi untuk sekitar 50 produk yang dapat dikonfigurasi yang memiliki sekitar 200 produk terkait sederhana.
Semua produk sederhana yang dikaitkan dengan atribut yang dapat dikonfigurasi memiliki merek yang sama. Idenya adalah untuk menghapus brand
dari atribut yang dapat dikonfigurasi dan menetapkannya sebagai atribut sederhana untuk produk yang dapat dikonfigurasi dengan nilai salah satu produk sederhana.
Berikut adalah kode yang melakukan ini. Kode dijalankan hanya satu kali. Itu dapat ditambahkan dalam skrip pemutakhiran atau file php sederhana.
<?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;
}
}
}
}
Untuk nomor yang tercantum di atas, ini membutuhkan waktu sekitar 15 detik untuk berjalan di mesin lokal saya (bukan yang kuat). Saya yakin ini bisa dioptimalkan. Kemungkinan besar tidak perlu mendapatkan semua produk sederhana dari produk yang dapat dikonfigurasi untuk mendapatkan brand
nilai, tapi saya tidak repot-repot.