Il modo più veloce per aggiornare un attributo in tutti i prodotti


Risposte:


22

Ciao Magento fornisce un attributo con il codice seguente

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

Esempio:

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

Utilizzo della raccolta prodotti:

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


}

Questo è super veloce! Ho provato Mage::getSingleton('catalog/product_api')->update();e Mage::getSingleton('catalog/product_action')->updateAttributes(). product_api ha impiegato 1,7 secondi su avg e product_action ha impiegato 1,0 secondi su avg. tuttavia, ha $product->getResource()->saveAttribute()assunto in media 0,04 secondi in media. Grazie!
Joshua Pack,

Esiste qualcosa di simile a questo metodo che può aggiornare gli attributi a un determinato livello di negozio?
Robbie Averill,

Thx @Amit Bera - 1 domanda rimanente;) c'è anche un modo per salvare più attributi in 1 volta? Di uno dovrebbe girare intorno $product->getResource()->saveAttributeall'azione. GRAZIE!!
snh_nl

@amit bera, per favore guarda questo magento.stackexchange.com/questions/201757/… cosa dovrei fare ??
abhishek,

@amit: ho bisogno di come posso modificare il sito Web in blocco (aggiorna l'attributo in multi-store)
zus

18

Scrivi una query SQL.

Secondo miglior modo (e quello che raccomando): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

Esempio di codice di 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);

Come funzionerebbe con i valori a selezione multipla? Aggiunge il valore o sovrascrive altri valori preselezionati?

Le selezioni multiple vengono normalmente salvate come numeri interi separati da virgola, come 27,42,4711 . Pertanto, se si modifica il valore per dire 1, gli altri valori vengono persi. Ma quello che puoi fare è qualcosa come CONCAT(value, ',1')aggiungere il nuovo valore alla fine, separato da una virgola. Penso che anche se aggiungi un valore due volte, questo non è un problema, perché Magento lo filtra la volta successiva che l'elemento viene salvato e ignora il secondo valore.


Questo aggiornerà solo 1k righe alla volta, non così rapidamente: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…
B00MER

Quando capisco correttamente il codice, scrive ogni 1000 righe, ma aggiorna tutto in una riga.
Fabian Blechschmidt,

1
Grazie @FabianBlechschmidt! Ecco il mio esempio di codice ( sintesi ):<?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
Il problema con questo approccio è che non reindicizza i prodotti, quindi potresti non vedere le modifiche nel frontend e vederle nel pannello di amministrazione. Per reindicizzare anche dopo l'aggiornamento è possibile modificare Mage::getSingleton('catalog/resource_product_action')a Mage::getModel('catalog/product_action')con gli stessi esatti parametri di cui sopra.
shampoo

1
@snh_nl ha aggiornato la risposta. Spero che questo risponda alla tua domanda
Fabian Blechschmidt,

5

10k prodotti, usa SQL. EAV confonde le acque. Per domanda è il modo più veloce.

Trova attributo_id

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

Aggiornamento con trovato attribute_iddalla query sopra.

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

Suppongo che potresti fare una sottoselezione con l'aggiornamento ma per motivi di semplicità due query SQL sono le più facili da comprendere.

NOTA: entity_type_id = 4 sono sempre le voci EAV del prodotto. Nel caso in cui sia necessario aggiornare in massa la categoria o gli attributi del cliente, questo differirà così come la tabella che viene aggiornata in base al tipo di attributo che si sta aggiornando. Inoltre, se hai una configurazione multi-store, assicurati di nota e condizionistore_id


2

Oltre alla risposta di Fabian sopra, puoi aggiornare più campi contemporaneamente. L'esempio che segue ha solo 2 (disponibile, stato dello stock), ma puoi usarne quanti ne desideri.

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

Quindi, se vuoi aggiornare tutti i prodotti allo stesso valore di attributo - come puoi adattarlo per aggiornare diciamo 3 prodotti, tutti lo stesso attributo, ma con valori diversi per l'attributo? grazie
snh_nl il

Vedi la risposta di Amit Bera sopra: magento.stackexchange.com/a/43924/3433
Silas Palmer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.