すべての製品の属性を更新する最速の方法


14

多くの製品(10.000以上)に価格を更新しようとしています。私が今それをしている方法は、非常に時間がかかります。すべての製品をループし、それらのほとんどを更新する最良の方法はどれですか?

ありがとう


回答:


22

こんにちはMagentoは以下のコードで属性を提供します

$product->setAttributeCode($newValue)
$ProductObject->getResource()->saveAttribute($product, 'attribute_Code');

例:

$product=Mage::getModel('catalog/product')->load($id);
$product->setSpecialFromDate('2010-10-28');
// below code use for time format 
$product->setSpecialFromDateIsFormated(true);
$product->getResource()->saveAttribute($product, 'special_from_date');

製品コレクションの使用:

$productIds = array(1,3,2);
$products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('entity_id', array('in' => $productIds));

foreach($products as $product)
{
    $product->setSpecialFromDate('2010-10-28');
    // below code use for time format 
    $product->setSpecialFromDateIsFormated(true);
    $product->getResource()->saveAttribute($product, 'special_from_date');


}

これは超高速です!私が試したMage::getSingleton('catalog/product_api')->update();Mage::getSingleton('catalog/product_action')->updateAttributes()。product_apiは平均で1.7秒かかり、product_actionは平均で1.0秒かかりました。ただし、$product->getResource()->saveAttribute()平均で0.04秒かかりました。ありがとう!
ジョシュアパック

特定のストアレベルで属性を更新できるこのメソッドに似たものはありますか?
ロビーアヴェリル

Thx @Amit Bera-残り1つの質問;)複数の属性を1回で保存する方法もありますか?の$product->getResource()->saveAttributeアクションをループする必要があります。THX!!
snh_nl

@amit BERA、plsはこれに見 magento.stackexchange.com/questions/201757/... 私は何をすべき?
-abhishek

@amit:私は私が変更のウェブサイト(多店舗でのupdate属性)は、バルクすることができますどのように必要
ZUS

18

SQLクエリを作成します。

次善の方法(および私が推奨する方法): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

u_maxxによるコード例:

$allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds();
$attributeCode = 'some_eav_attribute';
$attributeValue = NULL;
$attrData = array( $attributeCode => $attributeValue );
$storeId = 0;
// no reindex:<
Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);

これは複数選択値でどのように機能しますか?値を「追加」するか、事前に選択した他の値を上書きしますか

複数選択は、通常、カンマ区切りの整数として保存されます27,42,4711。したがって、値をsayに変更すると1、他の値は失われます。しかし、できることはCONCAT(value, ',1')、新しい値をコンマで区切って最後に追加するということです。私は考えてあなたが2倍に値を追加する場合でも、Magentoのは、それを項目が保存され、第2の値を無視している次の時間をフィルタリングするので、これは、問題ありません。


:これは、一度に、迅速ではないとして、1kの行が更新されますgithub.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/...
B00MER

コードを正しく理解すると、1000行ごとに書き込まれますが、すべての行が更新されます。
ファビアンBlechschmidt 14年

1
ありがとう@FabianBlechschmidt!ここに私のコード例である(要旨):<?php $allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds(); $attributeCode = 'some_eav_attribute'; $attributeValue = NULL; $attrData = array( $attributeCode => $attributeValue ); $storeId = 0; Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allProductIds, $attrData, $storeId);
マックスUroda

1
このアプローチの問題は、製品のインデックスを再作成しないため、フロントエンドで変更が表示されず、管理パネルで変更が表示される場合があることです。更新後にもインデックスを再作成するMage::getSingleton('catalog/resource_product_action')Mage::getModel('catalog/product_action')は、上記とまったく同じパラメーターに変更できます。
シャンプー

1
@snh_nlが答えを更新しました。これがあなたの質問に答えることを願っています
Fabian Blechschmidt

5

1万個の製品、SQLを使用します。EAVは単に水を汚します。質問ごとに最速の方法です。

attribute_idを検索

SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'

attribute_id上記のクエリから見つかったもので更新します。

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

更新を使用してサブセレクトを実行できると思いますが、簡単にするために、2つのSQLクエリを理解するのが最も簡単です。

注: entity_type_id = 4ほとんどの場合、製品のEAVエントリです。カテゴリまたは顧客属性を一括更新する必要がある場合、これは更新される属性のタイプに基づいて更新されるテーブルと同様に異なります。また、複数の店舗を設定している場合は、注意事項と条件を確認してくださいstore_id


2

上記のFabianの回答に加えて、一度に複数のフィールドを更新できます。次の例には2(在庫、在庫ステータス)しかありませんが、必要な数だけ使用できます。

    $product_ids = Mage::getModel('catalog/product')
        ->getCollection()
        ->addAttributeToFilter('status', array('eq' => 2)) //only disabled 
        ->getAllIds();

    $attrData = [
        ['attribute_one' => 1],
        ['attribute_two' => 1]
    ];

    $storeId = 0;
    Mage::getSingleton('catalog/resource_product_action')
       ->updateAttributes($product_ids, $attrData, $storeId);

これは、すべての製品を同じ属性値に更新する場合です-3つの製品、すべて同じ属性で、属性の値が異なる3つの製品を更新するにはどうすればよいでしょうか?thx
snh_nl

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.