นี่คือสิ่งที่ตะเข็บใช้งานได้สำหรับฉันในการลบแอตทริบิวต์ออกจากผลิตภัณฑ์ที่กำหนดค่าได้
นี่คือสถานการณ์
ผลิตภัณฑ์ที่กำหนดค่าได้ทั้งหมดนั้นสร้างขึ้นอย่างผิด ๆ โดยมีแอตทริบิวต์brand
เป็นคุณลักษณะที่กำหนดค่าได้สำหรับผลิตภัณฑ์ที่กำหนดค่าได้ประมาณ 50 รายการซึ่งมีผลิตภัณฑ์ที่เกี่ยวข้องประมาณ 200 รายการ
ผลิตภัณฑ์ง่าย ๆ ทั้งหมดที่เกี่ยวข้องกับแอตทริบิวต์ที่กำหนดค่าได้มียี่ห้อเดียวกัน แนวคิดคือการลบออกbrand
จากคุณสมบัติที่กำหนดค่าได้และกำหนดให้เป็นคุณสมบัติอย่างง่ายไปยังผลิตภัณฑ์ที่กำหนดค่าได้ด้วยมูลค่าของหนึ่งในผลิตภัณฑ์ที่เรียบง่าย
นี่คือรหัสที่ทำ รหัสทำงานเพียงครั้งเดียวเท่านั้น มันสามารถเพิ่มในสคริปต์อัพเกรดหรือไฟล์ 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;
}
}
}
}
สำหรับหมายเลขที่แสดงไว้ด้านบนการดำเนินการนี้ใช้เวลาประมาณ 15 วินาทีในการเรียกใช้บนเครื่องของฉัน (ไม่ใช่เครื่องที่ทรงพลัง) ฉันแน่ใจว่าสามารถเพิ่มประสิทธิภาพได้ ส่วนใหญ่อาจไม่จำเป็นต้องได้รับผลิตภัณฑ์ที่เรียบง่ายของผลิตภัณฑ์ที่กำหนดค่าได้เพื่อรับbrand
ค่า แต่ฉันไม่ได้รำคาญ