Produkty do zbiorczej aktualizacji o nowe witryny

16

Klient ma ponad 20000 produktów z 7 witrynami. Kiedyś mieli 4 strony internetowe, a większość produktów jest powiązanych z 4 stronami internetowymi. Jaki jest najlepszy i najszybszy sposób na iterację produktów i aktualizację produktów w celu uwzględnienia nowych stron internetowych.

Mam następujący kod, jednak jest on zbyt wolny:

$ productCollection = Mage :: getModel ('catalog / product') -> getCollection ()
    -> addFieldToFilter ('sku', tablica ('like' => '02% '));
foreach ($ productCollection as $ product) {
    echo $ product-> getSku ();
    $ product-> setWebsiteIds (tablica (1,2,3,4,5,6,7));
    próbować {
        $ product-> save ();
        echo "- zapisane.";
    } catch (wyjątek $ e) {
        echo '-'. $ e-> getMessage ();
    }
    echo "\ n";
}

Myślałem o użyciu metody marszu iteratora, ale rozumiem, że sklep / strona internetowa nie jest dokładnie atrybutem, więc nie można jej łatwo samodzielnie zaktualizować.

Raj
źródło

Odpowiedzi:

36

Krok 1
Zbuduj tablicę z nowymi identyfikatorami witryny.

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

Krok 2
Teraz zdobądź wszystkie identyfikatory produktu.

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

Krok 3
Przypisz wszystkie produkty do nowych stron internetowych:

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

Krok 4
Poczuj się dobrze.

Marius
źródło
1
Dziękuję Marius. Idealna odpowiedź. (Głosowałbym, ale jeszcze nie mogę)
Raj
3
krok 5 utwórz listę: gist.github.com/mauricioprado00/2b730532689d28dcdb2b . możesz zrobić „php -f shell / product-website.php - --products all --websites all” lub podać identyfikatory stron / produktów.
bezużyteczne
wow ... to niezwykle doskonałe, wydajne rozwiązanie. Nawet ja zamierzałem zapętlić wszystkie te produkty, aby je zaktualizować. Chcę wiedzieć, jak nauczyć się takich pojęć na temat Magento.
Deepanshu Goyal,
W typowy sposób Mariusza działał jak urok!
spareycle
1
Produkty nie pojawiają się w płaskim katalogu i nie są widoczne na froncie. Podczas korzystania z metody - save () produkty pojawiają się. Czy ktoś wie, dlaczego metoda Mariusa daje ten problem? M1.9, 4 strony internetowe, 15 tys. Produktów, płaski katalog
Tom
3

Jeśli chcesz dodać tylko produkty przypisane do wszystkich 4 wcześniej istniejących stron internetowych, użyj tego:

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

Zobacz także: Filtruj produkty według stron internetowych przy użyciu AND

Może to być skrypt instalacyjny Magento lub jednorazowy skrypt PHP (w tym przypadku dodaj include 'app/Mage.php';u góry i usuń go z serwera po użyciu)

Fabian Schmengler
źródło
1

Krok 1: Uzyskaj wszystkie identyfikatory witryny / utwórz tablicę identyfikatorów witryny

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

Krok 2: Uzyskaj wszystkie identyfikatory produktu

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

Krok 3: Dodaj identyfikatory witryn do wszystkich produktów

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

Uwaga: jeśli chcesz usunąć witrynę z produktu. użyj usuń zamiast dodaj słowo

$actionModel->updateWebsites($productIds, $websiteIds, 'remove');
Kailas
źródło
0

Kolejne rozwiązanie, jeśli twoje lenistwo do tego stopnia, że ​​nie chcesz tworzyć żadnych plików PHP:

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

Pracował dla mnie.

Shadowbob
źródło