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.