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

时间:2015-02-05 17:54:00

标签: php mysql magento

我有(.csv)文件有两列

例如:

old sku new sku

123 456

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

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

提前致谢

5 个答案:

答案 0 :(得分:5)

Magento不容易批量更换SKU。尝试通过导入/导出或数据流配置文件来执行此操作,您会遇到各种问题。但是,有一个相当简单的方法,它只需要在服务器上添加一个php脚本,并在SKU之前和之后添加一个CSV文件。这是一步一步的;

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

  1. 使用之前和之后的SKU创建CSV文件 在第一列中,列出您当前的SKU,在第二列中列出新的SKU。
  2. 不要在CSV文件中包含标题。

    确保此文件以UTF-8或ANSI编码保存为CSV文件。如果使用Excel创建文件,则可能会遇到此问题。

    1. 将CSV文件放在您的服务器上 将CSV文件上传到Magento服务器上的var / export目录,使其路径为/var/export/sku2sku.csv。

    2. 创建PHP脚本 在您的服务器上,在Magento安装目录(您看到应用程序,var,skin,media,js和其他目录的目录)中,创建一个新文件,保存它,并将其命名为“updateskus.php”。

    3. 将以下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即可。如果您有多站点设置,请使用托管服务提供商设置的主站点或主站点。
      2. 当页面打开时,您应该看到SKU已更新的确认消息。您的SKU现在应该已成功更新。

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

        1. 错误 如果您遇到以下错误,请不要太担心。只需重新运行脚本,看看是否有更新的SKU。
        2. 无法从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)

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

&#13;
&#13;
   

$get_item->setSku($new_sku);
$get_item->getResource()->saveAttribute($new_sku, 'sku');
&#13;
&#13;
&#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();

?>