Вы хотите обратить внимание на 2 поля, SKU и атрибуты, которые вы будете обновлять. В этом примере я собираюсь работать с атрибутом цвета, который является текстовым полем (код немного изменится, если вы имеете дело ни с чем, кроме текстового поля).
Во-первых, поскольку вы, вероятно, не хотите создавать полный модуль для обработки импорта, вам нужно будет инициализировать magento в новом PHP-файле. Добавьте полный путь к magento до приложения/Mage.php, если вы не используете этот скрипт в корневом пурпуре.
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";
}
}
Вам нужно будет запустить это из командной строки, поскольку это может занять некоторое время. Когда я сделал что-то похожее обновление aprox 4000 продуктов, потребовалось около 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']]);
С помощью multi-select вам необходимо предоставить CSV для setColor. Что-то вроде этого будет работать (при условии, что ваш 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);
Есть способы, чтобы избежать построения массива атрибутов меток и значений до того, как скрипт начинает работать, но это потребует дополнительной Lookups и замедлить импорт вниз.
Спасибо за ответ. Мой атрибут - это множественный тип select. Можете ли вы обновить код для нескольких атрибутов типа select и еще одну вещь. Можете ли вы написать код, подобный этому http://www.sonassi.com/knowledge-base/magento-kb/mass-update-stock-levels-in-magento-fast /, чтобы я мог выполнить его с помощью моего браузера. – user2344179
Обновление через браузер - невероятно плохая идея. Это означает, что тайм-аут оставит вас с помощью скрипта с половиной запуска.Хотя код очень похож, это будет работать не так быстро, поскольку он обновляет и сохраняет модель продукта, а не модель запаса продукта (что намного легче). –
Кроме того, просто добавлен небольшой бит о том, как работать с multi-select. Вам нужно будет скомпоновать этот код в полный скрипт, но все его там. –