Ürünleri yeni web siteleri içerecek şekilde toplu güncelleme


16

Bir müşterinin 7 web sitesi ile 20000+ ürünü vardır. Eskiden 4 web sitesi vardı ve çoğu ürün 4 web sitesiyle ilişkilendiriliyor. Ürünler arasında yineleme yapmanın ve ürünleri yeni web sitelerini içerecek şekilde güncellemenin en iyi ve en hızlı yolu nedir?

Ancak çok yavaş aşağıdaki kodu var:

$ productCollection = Mage :: getModel ('katalog / ürün') -> getCollection ()
    -> addFieldToFilter ('sku', dizi ('like' => '% 02'));
foreach ($ productCollection $ ürün olarak) {
    echo $ product-> getSku ();
    $ Ürün-> setWebsiteIds (dizi (1,2,3,4,5,6,7));
    Deneyin {
        $ Ürün-> save ();
        echo "- kaydedildi.";
    } catch (İstisna $ e) {
        echo '-'. $ e-> getMessage ();
    }
    echo "\ n";
}

Yineleyici yürüyüş yöntemini kullanmayı düşünüyordum ancak mağaza / web sitesinin tam olarak bir özellik olmadığını anlıyorum, bu yüzden kolayca kendi başına güncellenemiyor.

Yanıtlar:


36

Adım 1
Yeni web sitesi kimliklerinizle bir dizi oluşturun.

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

Adım 2
Şimdi tüm ürün kimliklerini alın.

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

Adım 3
Tüm ürünleri yeni web sitelerine atayın:

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

Adım 4
Kendinizi iyi hissedin.


1
Teşekkürler Marius. Mükemmel cevap. (Oy vereceğim ama henüz yapamıyorum)
Raj

3
adim 5 bir özgeçmiş oluşturun: gist.github.com/mauricioprado00/2b730532689d28dcdb2b . "php -f shell / product-website.php - - tüm ürünler - web siteleri hepsi" yapabilir veya web siteleri / ürün kimlikleri belirleyebilirsiniz.
yararsız

vay ... bu inanılmaz mükemmel ve verimli bir çözüm. Ben bile onları güncellemek için bu kadar çok ürünün etrafında dönecekti. Magento ile ilgili bu tür kavramların nasıl öğrenileceğini bilmek istiyorum.
Deepanshu Goyal

Tipik Marius moda, bir cazibe gibi çalıştı!
sparecycle

1
Ürünler düz katalogda görünmüyor ve ön tarafta görünmüyor. - save () yöntemini kullanırken ürünler görünür. Marius'un yönteminin neden bu sorunu verdiğini bilen var mı? M1.9, 4 web sitesi, 15k ürünler, düz katalog
Tom

3

Yalnızca önceden var olan 4 web sitesinin tümüne atanan ürünleri eklemek istiyorsanız , bunu kullanın:

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

Ayrıca bkz: Ürünleri AND kullanarak web sitesine göre filtreleme

Bu bir Magento kurulum betiği veya kalıcı bir PHP betiği olabilir (bu durumda include 'app/Mage.php';en üstte ekleyin ve kullanımdan sonra sunucudan kaldırın)


1

Adım 1: Tüm web sitesi kimlikleri alın / web sitesi kimlikleri dizisi oluşturun

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

2. Adım: Tüm ürün kimliklerini edinin

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

3. Adım: Tüm ürünlere web sitesi kimlikleri ekleyin

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

Not: Web sitesini üründen kaldırmak istiyorsanız. kullanmak kaldır yerine eklemek kelime

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

0

Tembelliğiniz herhangi bir PHP dosyası oluşturmak istemediğiniz noktaya gelirse başka bir çözüm:

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

Benim için çalıştı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.