您需要注意 2 个字段,SKU 和您将要更新的属性。在本例中,我将使用作为文本字段的颜色属性(如果您正在处理文本字段以外的任何内容,则代码会略有变化)。
首先,由于您可能不想构建一个完整的模块来处理导入,您需要在一个新的 PHP 文件中初始化 magento。除非您在 magento 根目录中运行此脚本,否则在 app/Mage.php 之前添加 magento 的完整路径。
require_once('app/Mage.php');
umask(0);
Mage::app();
接下来,您需要将 CSV 文件处理成一个数组。确保 CSV 的第一行包含列标题。此函数应负责将 CSV 处理为数组:https ://gist.github.com/jaywilliams/385876
包含该脚本后,您可以运行以下内容:
$csv_products = csv_to_array('path/to/your/csv/file.csv');
然后,您可以遍历每个产品,查找 SKU 并更新其颜色属性。这假定 SKU 属性为小写sku
,颜色属性为小写color
。
for($i=0;$i<sizeof($csv_products);$i++) {
$currentProduct = Mage::getModel('catalog/product')->loadByAttribute('sku',$csv_products[$i]['sku']);
if($currentProduct) {
$currentProduct->setColor($csv_products[$i]['color']);
$currentProduct->save();
//with 5,000 products you probably want to output something here so
//that you can make sure the script is running. Just make sure that
//you don't lose track of Product not found output (from below).
echo 'Success '.$i. ': ' . $csv_products[$i]['sku'] ."\n";
} else {
//we don't want to break the loop, but you'll probably want to record
//that this sku can't be found in magento. You can just echo this
//since the script will probably be running in the console.
echo 'Product not found: '.$csv_products[$i]['sku']."\n";
}
}
您需要从命令行运行它,因为它可能需要很长时间。当我更新大约 4,000 种产品时,我花了大约 2 个小时(更多属性,并使用下拉菜单)。
要使用下拉列表(仍然使用颜色示例),您可以在循环浏览产品之前添加类似这样的内容:
$color_attribute = Mage::getModel('eav/entity_attribute')->loadByCode('catalog_product', 'color');
$loaded_colors = array();
$valuesCollection = Mage::getResourceModel('eav/entity_attribute_option_collection')->setAttributeFilter($color_attribute->getId())->setStoreFilter(Mage_Core_Model_App::ADMIN_STORE_ID, false)->load();
foreach ($valuesCollection as $item) {
$loaded_colors[strtolower($item->getValue())] = $item->getId();
}
然后你可以设置一个这样的颜色属性:
$currentProduct->setColor($loaded_colors[$csv_products[$i]['color']]);
使用多选时,您需要向 setColor 提供 CSV。这样的事情会起作用(假设您的 CSV 在单个字段中有一个逗号分隔的选项列表)。
$colorArray = explode(',',$csv_products[$i]['color']);
if(sizeof($colorArray) > 1) {
for($k = 0;$k<sizeof($colorArray);$k++) {
$colorArray[$k] = $loaded_colors[$colorArray[$k]];
}
$colorString = implode(',',$colorArray);
} else {
$colorString = $csv_products[$i]['color'];
}
$currentProduct->setColor($colorString);
有一些方法可以避免在脚本开始运行之前构建属性标签和值的数组,但这需要额外的查找并减慢导入速度。