我有一个具有两列的(.csv)文件
例如:
旧sku新sku
123 456
我想用新的sku编号替换每个产品的sku编号。
我店里有5000多种产品。
提前感谢
Magento不容易批量更改SKU。尝试通过导入/导出或数据流配置文件执行此操作,会遇到各种问题。然而,有一种相当简单的方法可以做到这一点,它只需向服务器添加一个php脚本和一个SKU前后的CSV文件。以下是循序渐进的步骤;
注意:在对所有SKU进行测试之前,请确保只对一到两个产品SKU进行测试。此外,在尝试此操作之前,请确保备份数据库。
- 创建带有前后SKU的CSV文件在第一列中,列出您当前的SKU,在第二列中列出新的SKU
不要在CSV文件中包含标题。
请确保此文件以UTF-8或ANSI编码保存为CSV文件。如果使用Excel创建文件,则可能会遇到此问题。
-
将CSV文件放在服务器上将CSV文件上传到Magento服务器上的var/export目录,使其路径为/var/export/sku2sku.CSV。
-
创建PHP脚本在您的服务器上,在Magento安装目录(您可以在其中看到应用程序、var、皮肤、媒体、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);
?>
- 运行脚本要运行脚本,只需使用互联网浏览器并导航到http://yoursite.com/updateskus.php.如果您有多站点设置,请使用托管提供商设置的主站点或主站点
当页面打开时,您应该会看到您的SKU已更新的确认消息。您的SKU现在应该已成功更新。
如果您完成了SKU的更新,请删除添加到服务器中的CSV和PHP文件。
- 错误如果你遇到以下错误,不要太担心。只需重新运行脚本,看看是否有更多SKU得到更新
无法从Magento检索产品:SQLSTATE[40001]:序列化失败:1213尝试获取锁时发现死锁;尝试重新启动事务
如果你有很多SKU需要更新,你可以预计脚本至少需要几分钟才能完成。
这段代码对我来说工作得很快。我用它。
<?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);
?>
要获得最佳性能,请使用:
$get_item->setSku($new_sku);
$get_item->getResource()->saveAttribute($new_sku, 'sku');
以下代码解释了如何基于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";
}
}
}
我接受了这两个建议并创建了updateSkus.php
将它放在magento中的shell目录中,可以通过以下方式运行:php updateSkus.php --filename skus.csv
skus.csv应该是oldSku的逗号列表,类似于newSku,每个sku对之间有一行新行。
旧Sku、新Sku
旧Sku、新Sku
旧Sku、新Sku
更新Skus.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 rn";
} else {
echo "item not found rn";
}
}
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();
?>