如何在 magento 中替换 5000 种产品的 sku 编号

How to replace the sku number for 5000 products in magento

我有包含两列的 (.csv) 文件

例如:

旧 sku 新 sku

123 456

我想用新的 sku 编号替换每个产品的 sku 编号。

我的店里有 5000 多种产品。

提前致谢

Magento 不容易批量更改 SKU。尝试通过 import/export 或数据流配置文件来做到这一点,你 运行 会遇到各种问题。但是,有一种相当简单的方法可以做到这一点,它只需要将 php 脚本添加到您的服务器以及 SKU 前后的 CSV 文件。这是 step-by-step;

注意:在对所有 SKU 进行测试之前,请务必仅使用一两个产品 SKU 进行测试。另外,请务必在尝试此操作之前备份您的数据库。

  1. 创建包含之前和之后 SKU 的 CSV 文件 在第一列中列出您当前的 SKU,在第二列中列出新的 SKU。

不要在 CSV 文件中包含标题。

确保将此文件保存为 UTF-8 或 ANSI 编码的 CSV 文件。如果您使用 Excel.

创建文件,您可能 运行 会遇到问题
  1. 将 CSV 文件放在您的服务器上 将 CSV 文件上传到 Magento 服务器上的 var/export 目录,使其路径为 /var/export/sku2sku.csv.

  2. 创建 PHP 脚本 在您的服务器上,在您的 Magento 安装目录(您可以看到 app、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);
?>
  1. 运行 脚本 要 运行 脚本,只需使用您的互联网浏览器并导航至 http://yoursite.com/updateskus.php。如果您有 multi-site 设置,请使用托管服务提供商设置的主站点或主站点。

当页面打开时,您应该会看到您的 SKU 已更新的确认消息。您的 SKU 现在应该已成功更新。

如果您已完成 SKU 更新,请删除您添加到服务器的 CSV 和 PHP 文件。

  1. 错误 如果您 运行 遇到以下错误,请不要太担心。只需 re-run 脚本,看看是否有更多 SKU 得到更新。

无法从 Magento 检索产品:SQLSTATE[40001]:序列化失败:尝试获取锁时发现 1213 死锁;尝试重启交易

如果您有很多 SKU 需要更新,脚本至少需要几分钟才能完成。

为获得最佳性能,请使用:

   

$get_item->setSku($new_sku);
$get_item->getResource()->saveAttribute($new_sku, '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);
?>

以下代码说明了如何根据 CSV 中的旧 sku 批量更新产品 sku file.Please 请参阅教程以获取分步说明。 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 对之间换行。

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();

?>