Prodotti di aggiornamento collettivo per includere nuovi siti Web


16

Un cliente ha oltre 20000 prodotti con 7 siti Web. Avevano 4 siti Web e la maggior parte dei prodotti sono associati a 4 siti Web. Qual è il modo migliore e più rapido per scorrere i prodotti e aggiornarli per includere i nuovi siti Web.

Ho il seguente codice ma è troppo lento:

$ productCollection = Mage :: getModel ('catalogue / product') -> getCollection ()
    -> addFieldToFilter ('sku', array ('like' => '02% '));
foreach ($ productCollection come $ product) {
    echo $ product-> getSku ();
    $ Prodotto-> setWebsiteIds (array (1,2,3,4,5,6,7));
    provare {
        $ Prodotto-> save ();
        echo "- salvato.";
    } catch (eccezione $ e) {
        echo '-'. $ e-> getMessage ();
    }
    echo "\ n";
}

Stavo pensando di utilizzare il metodo iterator walk, tuttavia capisco che il negozio / sito Web non è esattamente un attributo, quindi non può essere facilmente aggiornato da solo.

Risposte:


36

Passaggio 1
Creare un array con i nuovi ID del sito Web.

$websiteIds = array(5,6,7);

Passaggio 2
Ora ottieni tutti gli ID prodotto.

$productIds= Mage::getResourceModel('catalog/product_collection')->getAllIds();

Passaggio 3
Assegnare tutti i prodotti ai nuovi siti Web:

Mage::getModel('catalog/product_website')->addProducts($websiteIds, $productIds);

Step 4
Sentiti bene con te stesso.


1
Grazie Marius. Risposta perfetta (Vorrei votare ma non posso ancora)
Raj

3
passaggio 5 creare un riassunto : gist.github.com/mauricioprado00/2b730532689d28dcdb2b . puoi fare "php -f shell / product-website.php - --products all --we website all" o specificare id di siti web / prodotti.
inutile il

wow ... questa è una soluzione efficiente incredibilmente perfetta. Anche io avrei fatto il giro di tutti quei tanti prodotti per aggiornarli. Voglio sapere come imparare tali concetti su Magento.
Deepanshu Goyal,

In tipico stile Marius, ha funzionato come un fascino!
sparecycle

1
I prodotti non sembrano apparire nel catalogo flat e non sono visibili sul frontend. Quando si utilizza il metodo - save () i prodotti vengono visualizzati. Qualcuno sa perché il metodo di Marius dà questo problema? M1.9, 4 siti web, 15k prodotti, catalogo flat
Tom

3

Se desideri solo aggiungere i prodotti assegnati a tutti e 4 i siti Web precedentemente esistenti, utilizza questo:

$oldWebsiteIds = [2, 3, 4, 5];
$newWebsiteIds = [6, 7, 8]

/** @var Mage_Catalog_Model_Resource_Product_Collection $productCollection */
$productCollection = Mage::getResourceModel('catalog/product_collection');
$productCollection->addWebsiteFilter($oldWebsiteIds );
// only filter products present in ALL of the websites
$productCollection->getSelect()
    ->having('COUNT(website_id) = ?', count($oldWebsiteIds))
    ->distinct(false)
    ->group('e.entity_id');
$productIds = $productCollection->getAllIds();

Mage::getModel('catalog/product_website')->addProducts($newWebsiteIds, $productIds);

Vedi anche: Filtra i prodotti per sito Web utilizzando AND

Questo può essere uno script di installazione di Magento o uno script PHP usa e getta (in questo caso aggiungere include 'app/Mage.php';in alto e rimuoverlo dal server dopo l'uso)


1

Passaggio 1: ottenere tutti gli ID sito Web / creare una serie di ID sito Web

$websiteIds = Mage::getResourceModel('core/website_collection')->getAllIds();

Passaggio 2: ottieni tutti gli ID prodotto

$productIds= Mage::getResourceModel('catalog/product_collection')->getAllIds();

Passaggio 3: aggiungere gli ID dei siti Web a tutti i prodotti

$actionModel = Mage::getSingleton('catalog/product_action');
$actionModel->updateWebsites($productIds, $websiteIds, 'add');

Nota: se si desidera rimuovere il sito Web dal prodotto. usa Rimuovi invece Aggiungi parola

$actionModel->updateWebsites($productIds, $websiteIds, 'remove');

0

Un'altra soluzione se la tua pigrizia arriva al punto di non voler creare alcun file PHP:

INSERT IGNORE INTO catalog_product_website
SELECT entity_id, {website_id} FROM catalog_product_entity

Ha funzionato per me.

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.