多くの製品(10.000以上)に価格を更新しようとしています。私が今それをしている方法は、非常に時間がかかります。すべての製品をループし、それらのほとんどを更新する最良の方法はどれですか?
ありがとう
多くの製品(10.000以上)に価格を更新しようとしています。私が今それをしている方法は、非常に時間がかかります。すべての製品をループし、それらのほとんどを更新する最良の方法はどれですか?
ありがとう
回答:
こんにちは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秒かかりました。ありがとう!
$product->getResource()->saveAttribute
アクションをループする必要があります。THX!!
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($allProductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allProductIds, $attrData, $storeId);
これは複数選択値でどのように機能しますか?値を「追加」するか、事前に選択した他の値を上書きしますか
複数選択は、通常、カンマ区切りの整数として保存されます27,42,4711
。したがって、値をsayに変更すると1
、他の値は失われます。しかし、できることはCONCAT(value, ',1')
、新しい値をコンマで区切って最後に追加するということです。私は考えてあなたが2倍に値を追加する場合でも、Magentoのは、それを項目が保存され、第2の値を無視している次の時間をフィルタリングするので、これは、問題ありません。
<?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);
Mage::getSingleton('catalog/resource_product_action')
にMage::getModel('catalog/product_action')
は、上記とまったく同じパラメーターに変更できます。
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
上記の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);