Cara tercepat untuk memperbarui atribut di semua produk

Jawaban:

22

Hai Magento memberikan atribut dengan kode di bawah ini

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

Contoh:

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

Menggunakan Koleksi Produk:

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


}
Amit Bera
sumber
Ini sangat cepat! Saya sudah mencoba Mage::getSingleton('catalog/product_api')->update();dan Mage::getSingleton('catalog/product_action')->updateAttributes(). product_api mengambil rata-rata 1,7 detik dan product_action mengambil rata-rata 1,0 detik. Namun, $product->getResource()->saveAttribute()gunakan rata-rata 0,04 detik pada rata-rata. Terima kasih!
Joshua Pack
Adakah yang serupa dengan metode ini yang dapat memperbarui atribut di tingkat toko tertentu?
Robbie Averill
Thx @Amit Bera - 1 pertanyaan tersisa;) apakah ada juga cara untuk menyimpan beberapa atribut sekaligus? Tentu kita harus mengulang $product->getResource()->saveAttributetindakan. TERIMA KASIH!!
snh_nl
@amit bera, mohon lihat magento.stackexchange.com/questions/201757/… ini apa yang harus saya lakukan ??
abhishek
@amit: Saya perlu bagaimana saya dapat mengubah situs web secara massal (memperbarui atribut di multi-store)
zus
18

Tulis SQL Query.

Cara terbaik kedua (dan yang saya sarankan): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

Contoh kode oleh 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);

Bagaimana ini akan bekerja dengan nilai-nilai pilihan ganda? Apakah itu 'menambah' nilai atau menimpa nilai yang sudah dipilih sebelumnya

Multiselek biasanya disimpan sebagai bilangan bulat yang dipisah koma, seperti 27,42,4711. Karena itu jika Anda mengubah nilai untuk mengatakan 1, nilai-nilai lainnya hilang. Tapi yang bisa Anda lakukan adalah sesuatu seperti CONCAT(value, ',1')menambahkan nilai baru ke akhir, dipisahkan dengan koma. Saya pikir bahkan jika Anda menambahkan nilai dua kali, ini tidak masalah, karena Magento memfilternya saat item disimpan dan mengabaikan nilai kedua.

Fabian Blechschmidt
sumber
Ini hanya akan memperbarui baris 1r
B00MER
Ketika saya mengerti kodenya dengan benar, ia menulis setiap 1000 baris, tetapi memperbarui semuanya dalam satu baris.
Fabian Blechschmidt
1
@FabianBlechschmidt terima kasih! Berikut ini contoh kode saya ( inti ):<?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
Masalah dengan pendekatan ini adalah bahwa itu tidak mengindeks ulang produk, jadi Anda mungkin tidak melihat perubahan di frontend dan hanya melihatnya di panel admin. Juga mengindeks setelah update Anda dapat mengubah Mage::getSingleton('catalog/resource_product_action')ke Mage::getModel('catalog/product_action')dengan parameter yang sama persis yang disebutkan di atas.
keramas
1
@ snh_nl memperbarui jawabannya. Semoga ini menjawab pertanyaan Anda
Fabian Blechschmidt
5

10k produk, gunakan SQL. EAV hanya merusak air. Per pertanyaan adalah cara tercepat.

Temukan atribut_id

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

Pembaruan dengan ditemukan attribute_iddari permintaan di atas.

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

Saya kira Anda bisa melakukan subselect dengan pembaruan tetapi untuk kesederhanaan demi dua pertanyaan SQL paling mudah untuk dipahami.

CATATAN: entity_type_id = 4 paling sering entri EAV produk. Jika Anda perlu untuk memperbarui kategori massal atau atribut pelanggan, ini akan berbeda serta tabel yang diperbarui berdasarkan pada jenis atribut apa yang Anda perbarui. Juga jika Anda memiliki pengaturan multi-toko pastikan dan perhatikan dan kondisistore_id

B00MER
sumber
2

Selanjutnya untuk jawaban Fabian di atas, Anda dapat memperbarui beberapa bidang sekaligus. Contoh di bawah ini hanya memiliki 2 (dalam stok, status stok), tetapi Anda dapat menggunakan sebanyak yang Anda inginkan.

    $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);
Silas Palmer
sumber
Jadi ini adalah jika Anda ingin memperbarui semua produk dengan nilai atribut yang sama - bagaimana Anda bisa mengadaptasi ini untuk memperbarui mengatakan 3 produk, semua atribut yang sama, tetapi dengan nilai yang berbeda untuk atribut tersebut? thx
snh_nl
Lihat jawaban Amit Bera di atas: magento.stackexchange.com/a/43924/3433
Silas Palmer