【问题标题】:How to replace the sku number for 5000 products in magento如何在magento中替换5000个产品的sku号
【发布时间】:2015-02-05 17:53:59
【问题描述】:

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

例如:

旧sku 新sku

123 456

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

我的商店中有超过 5000 种产品。

提前致谢

【问题讨论】:

  • 如何使用 foreach 循环,查找数据,如果找到则替换它...
  • 感谢劳伦斯的回答。可能是你搞错了。我有 excel 文件。我问在 magento 或 mysql 中是否有任何内置设施,可以用 new 替换我当前的 sku 编号。我只是导入excel文件。我将您的选项放在最后一个选项中,以制作一个 php 脚本并读取 excel 文件并用新的替换现有的 sku。
  • 对于 SQL 来说似乎是一项很棒的工作,不需要编程。我假设你在某处有某种 old_sku,new_sku 关系?
  • @JimitShah 它清楚地写着.csv :/
  • magento 将 sku 信息存储在许多不同的表中。我想知道任何简单的选项,我只需将带有新旧 sku 代码的新 (.csv) 文件上传到其中。将 sku 代码从旧代码替换为新代码?

标签: php mysql magento


【解决方案1】:

Magento 无法轻松地批量更改 SKU。尝试通过导入/导出或数据流配置文件执行此操作,您会遇到各种问题。但是,有一种相当简单的方法可以做到这一点,它只需向您的服务器添加一个 php 脚本和一个 SKU 前后的 CSV 文件。这是一步一步的;

注意:在对所有 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. 运行脚本 要运行该脚本,只需使用您的 Internet 浏览器并导航到 http://yoursite.com/updateskus.php。如果您有多站点设置,请使用托管服务提供商设置的主站点或主站点。

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

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

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

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

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

【讨论】:

  • 为每一行加载和保存整个产品模型将消耗 5000 个产品的大量内存,并且可能会失败。对于这样的工作,我建议使用 Mage_Core_Model_Resource_Iterator 甚至直接 SQL 查询。
【解决方案2】:

此代码非常适合我。我用它。

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

【讨论】:

  • 由于此代码对您有所帮助,因此对于开场白来说,这将不是一个有用的答案,因为您没有为他的问题更改它并且您没有给出任何解释。请通过编辑您的答案提供更多信息
  • 这工作很快。现在才试了一下。不要忘记将 catalog_product_entity 更改为带有后缀的表名。 :)
  • 工作正常。唯一的问题是有点慢...每个 SKU 节省 6 秒
【解决方案3】:

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

   

$get_item->setSku($new_sku);
$get_item->getResource()->saveAttribute($new_sku, 'sku');

【讨论】:

  • (更新)这将不起作用:SKU 的 saveAttribute。 SKU 不是 EAV 属性,需要以不同方式保存/更新...
【解决方案4】:

以下代码说明了如何根据 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";
    }
}

}

【讨论】:

    【解决方案5】:

    我接受了这两个建议并创建了 updateSkus.php

    将它放在magento 内的shell 目录中,并可以通过以下方式运行:php updateSkus.php --filename skus.csv

    skus.csv 应该是 oldSku,newSku 的逗号列表,每个 sku 对之间都有一个新行。

    旧Sku,新Sku

    旧Sku,新Sku

    旧Sku,新Sku

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

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多