我有(.csv)文件有两列
例如:
old sku new sku
123 456
我想用新的sku编号替换每个产品的sku编号。
我的商店里有超过5000种产品。
提前致谢
答案 0 :(得分:5)
Magento不容易批量更换SKU。尝试通过导入/导出或数据流配置文件来执行此操作,您会遇到各种问题。但是,有一个相当简单的方法,它只需要在服务器上添加一个php脚本,并在SKU之前和之后添加一个CSV文件。这是一步一步的;
注意:在使用所有SKU之前,请务必仅使用一个或两个产品SKU进行测试。另外,在尝试此操作之前,请务必备份数据库。
不要在CSV文件中包含标题。
确保此文件以UTF-8或ANSI编码保存为CSV文件。如果使用Excel创建文件,则可能会遇到此问题。
将CSV文件放在您的服务器上 将CSV文件上传到Magento服务器上的var / export目录,使其路径为/var/export/sku2sku.csv。
创建PHP脚本 在您的服务器上,在Magento安装目录(您看到应用程序,var,skin,media,js和其他目录的目录)中,创建一个新文件,保存它,并将其命名为“updateskus.php”。
将以下php代码粘贴到updateskus.php中并保存文件。
<?php
include_once './app/Mage.php';
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$updates_file="./var/export/sku2sku.csv";
$sku_entry=array();
$updates_handle=fopen($updates_file, 'r');
if($updates_handle) {
while($sku_entry=fgetcsv($updates_handle, 1000, ",")) {
$old_sku=$sku_entry[0];
$new_sku=$sku_entry[1];
echo "<br>Updating ".$old_sku." to ".$new_sku." - ";
try {
$get_item = Mage::getModel('catalog/product')->loadByAttribute('sku', $old_sku);
if ($get_item) {
$get_item->setSku($new_sku)->save();
echo "successful";
} else {
echo "item not found";
}
} catch (Exception $e) {
echo "Cannot retrieve products from Magento: ".$e->getMessage()."<br>";
return;
}
}
}
fclose($updates_handle);
?>
当页面打开时,您应该看到SKU已更新的确认消息。您的SKU现在应该已成功更新。
如果您已完成更新SKU,请删除您添加到服务器的CSV和PHP文件。
无法从Magento检索产品:SQLSTATE [40001]:序列化失败:1213尝试获取锁定时发现死锁;尝试重新启动交易
如果要更新许多SKU,您可以预期脚本至少需要几分钟才能完成。
答案 1 :(得分:4)
这段代码非常适合我。我用它。
<?php
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 'Off');
umask(0);
Mage::app('admin');
Mage::register('isSecureArea', 1);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
set_time_limit(0);
ini_set('memory_limit','1024M');
$resource = Mage::getSingleton('core/resource');
$writeConnection = $resource->getConnection('core_write');
$updates_file="./var/export/sku2sku.csv";
$sku_entry=array();
$updates_handle=fopen($updates_file, 'r');
if($updates_handle) {
while($sku_entry=fgetcsv($updates_handle, 1000, ",")) {
$old_sku=$sku_entry[0];
$new_sku=$sku_entry[1];
echo "<br>Updating ".$old_sku." to ".$new_sku." - ";
try {
$get_item = Mage::getModel('catalog/product')->loadByAttribute('sku', $old_sku);
if ($get_item) {
$product_id = $get_item->getId();
$writeConnection->update(
"catalog_product_entity",
array("sku" => $new_sku),
"entity_id=$product_id"
);
echo "successful";
} else {
echo "item not found";
}
} catch (Exception $e) {
echo "Cannot retrieve products from Magento: ".$e->getMessage()."<br>";
return;
}
}
}
fclose($updates_handle);
?>
答案 2 :(得分:1)
为获得最佳性能,请使用:
$get_item->setSku($new_sku);
$get_item->getResource()->saveAttribute($new_sku, 'sku');
&#13;
答案 3 :(得分:1)
以下代码说明了如何根据CSV文件中的旧sku批量更新产品sku。请参阅教程以获得分步说明。 http://www.pearlbells.co.uk/bulk-update-magento-products-sku/
function rewriteSku($newDatas) {
$i = 1;
foreach($newDatas as $newData) {
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $newData[1]);
if($product) {
$product->setSku($newData[0]);
$product->save();
echo $i++.' '.$product->getName() . ' SKU updated';
echo "\n";
}
}
}
答案 4 :(得分:0)
我采纳了这两个建议并创建了 updateSkus.php
将其放在magento的shell目录中,可以通过以下方式运行:php updateSkus.php --filename skus.csv
skus.csv应该是oldSku,newSku的逗号列表,例如每个sku对之间都有新行。
oldSku,newSku
oldSku,newSku
oldSku,newSku
updateSkus.php
<?php
require_once 'abstract.php';
class Update_Products_Sku extends Mage_Shell_Abstract
{
public function run()
{
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$updates_file = $this->getArg('filename');
if(empty($updates_file) ) {
echo $this->usageHelp();
} else {
$resource = Mage::getSingleton('core/resource');
$writeConnection = $resource->getConnection('core_write');
$sku_entry = array();
$updates_handle = fopen($updates_file, 'r');
if ($updates_handle) {
while ($sku_entry = fgetcsv($updates_handle, 1000, ",")) {
$old_sku = $sku_entry[0];
$new_sku = $sku_entry[1];
echo "Updating " . $old_sku . " to " . $new_sku . " - ";
try {
$get_item = Mage::getModel('catalog/product')->loadByAttribute('sku', $old_sku);
if ($get_item) {
// $get_item->setSku($new_sku)->save();
$product_id = $get_item->getId();
$writeConnection->update("catalog_product_entity",array("sku" => $new_sku),"entity_id=$product_id");
echo "successful \r\n";
} else {
echo "item not found \r\n";
}
}
catch (Exception $e) {
echo "Cannot retrieve products from Magento: " . $e->getMessage() . "<br>";
return;
}
}
}
fclose($updates_handle);
}
}
public function usageHelp()
{
return <<<USAGE
Usage: php updateSkus.php -- [options]
--filename <filename.csv> simple csv file listing old oldSku,newSku one per line
USAGE;
}
}
$shell = new Update_Products_Sku();
$shell->run();
?>