Tüm ürünlerdeki bir özelliği güncellemenin en hızlı yolu


Yanıtlar:


22

Merhaba Magento aşağıdaki kodu kullanarak bir özellik sağlar

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

Misal:

$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');

Ürün Koleksiyonunu Kullanma:

$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');


}

Bu süper hızlı! Denedim Mage::getSingleton('catalog/product_api')->update();ve Mage::getSingleton('catalog/product_action')->updateAttributes(). product_api avg'de 1.7 saniye, product_action avg'da 1.0 saniye sürdü. ancak, $product->getResource()->saveAttribute()ortalama ort. Teşekkürler!
Joshua Pack

Belirli bir mağaza düzeyinde özellikleri güncelleyebilen bu yönteme benzer bir şey var mı?
Robbie Averill

Thx @Amit Bera - 1 soru kaldı;) 1 seferde birden fazla özelliği kaydetmenin bir yolu var mı? Biri $product->getResource()->saveAttributeeylem etrafında döngü gerekir . TEŞEKKÜR!!
snh_nl

@amit bera, pls bu magento.stackexchange.com/questions/201757/… içine bak ne yapmalıyım?
abhishek

@amit: Web sitesini nasıl değiştirebileceğime ihtiyacım var (çoklu mağazada güncelleme özelliği)
zus

18

Bir SQL Sorgusu yazın.

İkinci en iyi yol (ve önerdiğim): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

U_maxx tarafından kod örneği:

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

Bu, çoklu seçim değerleriyle nasıl çalışır? Değeri 'ekler' veya önceden seçilmiş diğer değerlerin üzerine yazar mı?

Çoklu seçimler normalde olduğu gibi virgülle ayrılmış tamsayılar olarak kaydedilir 27,42,4711. Bu nedenle, değeri söyleyecek şekilde değiştirirseniz 1, diğer değerler kaybolur. Ancak yapabileceğiniz şey CONCAT(value, ',1'), virgülle ayrılmış, yeni değeri sonuna eklemek anlamına gelir. Ben düşünüyorum Eğer Magento o madde kaydedilir dahaki sefere filtreler ve ikinci değeri yok sayar çünkü bu, hiçbir sorun, bir değerini iki kez eklemek bile.


Bu, yalnızca bir seferde 1k satırı günceller, hızlı değil: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…
B00MER

Kodu doğru anladığımda, her 1000 satırda yazıyor, ancak üst üste güncelleniyor.
Fabian Blechschmidt

1
Teşekkürler @FabianBlechschmidt! İşte benim kod örneği ( gist ):<?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);
Max Uroda

1
Bu yaklaşımla ilgili sorun, ürünleri yeniden endekslememesi, bu nedenle ön uçta değişiklikler görmeyebilir ve yalnızca yönetici panelinde görebilirsiniz. Güncellemeden sonra yeniden endekslemek Mage::getSingleton('catalog/resource_product_action')için Mage::getModel('catalog/product_action')yukarıda belirtilen parametrelerle de değiştirebilirsiniz .
şampuan

1
@snh_nl cevabı güncelledi. Umarım bu soruya cevap verir
Fabian Blechschmidt

5

10k ürünlerde SQL kullanın. EAV sadece suları çamurluyor. Soru başına en hızlı yoldur.

Özellik_kimliğini bul

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

attribute_idYukarıdaki sorgudan bulunan ile güncelleme .

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

Sanırım güncelleme ile bir alt seçim yapabilirsiniz ama sadelik için iki SQL sorguları kavramak kolay.

NOT: entity_type_id = 4 her zaman ürün EAV girişleridir. Toplu güncelleme kategorisini veya müşteri özelliklerini değiştirmeniz gerekiyorsa, bu güncellemenin ne tür bir özellik olduğuna bağlı olarak güncellenen tablo kadar farklı olacaktır. Ayrıca çoklu mağaza kurulumunuz varsa, not edin ve koşullandırınstore_id


2

Fabian'ın yukarıdaki cevabına ek olarak, aynı anda birden fazla alanı güncelleyebilirsiniz. Aşağıdaki örnekte yalnızca 2 tane (stokta, stok durumu) bulunmaktadır, ancak istediğiniz kadar kullanabilirsiniz.

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

Öyleyse bu, tüm ürünleri aynı özellik değerine güncellemek istiyorsanız - bunu, aynı özellik olan ancak özellik için farklı değerlerle 3 ürününü güncellemek için nasıl uyarlayabilirsiniz? thx
snh_nl

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.