Massenaktualisierung von Produkten, um neue Websites aufzunehmen

16

Ein Kunde hat mehr als 20000 Produkte mit 7 Websites. Früher hatten sie 4 Websites, und die meisten Produkte sind mit 4 Websites verknüpft. Was ist der beste und schnellste Weg, um durch die Produkte zu iterieren und die Produkte zu aktualisieren, um die neuen Websites einzuschließen?

Ich habe den folgenden Code, aber es ist viel zu langsam:

$ productCollection = Mage :: getModel ('Katalog / Produkt') -> getCollection ()
    -> addFieldToFilter ('sku', array ('like' => '02% '));
foreach ($ productCollection als $ product) {
    echo $ product-> getSku ();
    $ product-> setWebsiteIds (array (1,2,3,4,5,6,7));
    Versuchen {
        $ product-> save ();
        Echo "- gespeichert.";
    } catch (Ausnahme $ e) {
        echo '-'. $ e-> getMessage ();
    }
    Echo "\ n";
}

Ich habe überlegt, die Iterator-Walk-Methode zu verwenden, aber ich verstehe, dass der Shop / die Website nicht genau ein Attribut ist und daher nicht einfach von alleine aktualisiert werden kann.

Raj
quelle

Antworten:

36

Schritt 1
Erstellen Sie ein Array mit Ihren neuen Website-IDs.

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

Schritt 2
Holen Sie sich jetzt alle Produkt-IDs.

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

Schritt 3
Ordnen Sie alle Produkte den neuen Websites zu:

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

Schritt 4
Fühlen Sie sich gut mit sich.

Marius
quelle
1
Vielen Dank, Marius. Perfekte Antwort. (Ich würde abstimmen, aber ich kann noch nicht)
Raj
3
Schritt 5 Erstellen Sie eine Zusammenfassung: gist.github.com/mauricioprado00/2b730532689d28dcdb2b . Sie können "php -f shell / product-website.php - --products all --websites all" ausführen oder Websites / Produkt-IDs angeben.
nutzlos
wow ... das ist eine erstaunlich perfekte, effiziente Lösung. Sogar ich wollte all diese vielen Produkte durchgehen, um sie zu aktualisieren. Ich möchte wissen, wie man solche Konzepte über Magento lernt.
Deepanshu Goyal
In typischer Marius-Manier wie ein Zauber gearbeitet!
Sparecycle
1
Die Produkte scheinen nicht im Flat-Katalog zu erscheinen und sind im Frontend nicht sichtbar. Bei Verwendung der Methode - save () werden die Produkte angezeigt. Weiß jemand, warum Marius Methode dieses Problem gibt? M1.9, 4 Websites, 15k Produkte, flache Katalog
Tom
3

Wenn Sie nur die Produkte hinzufügen möchten, die allen vier zuvor vorhandenen Websites zugewiesen sind , verwenden Sie diese Option:

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

Siehe auch: Filtern von Produkten nach Website mithilfe von AND

Dies kann ein Magento-Setup-Skript oder ein wegwerfbares PHP-Skript sein (in diesem Fall oben hinzufügen include 'app/Mage.php';und nach der Verwendung vom Server entfernen).

Fabian Schmengler
quelle
1

Schritt 1: Alle Website-IDs abrufen / Reihe von Website-IDs erstellen

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

Schritt 2: Alle Produkt-IDs abrufen

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

Schritt 3: Fügen Sie allen Produkten Website-IDs hinzu

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

Hinweis: Wenn Sie die Website aus dem Produkt entfernen möchten. benutze remove statt add word

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

Eine andere Lösung, wenn Sie so faul sind, dass Sie keine PHP-Dateien mehr erstellen möchten:

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

Hat für mich gearbeitet.

Shadowbob
quelle