Perbarui produk secara massal untuk memasukkan situs web baru

16

Seorang klien memiliki 20000+ produk dengan 7 situs web. Mereka dulunya memiliki 4 situs web dan sebagian besar produk dikaitkan dengan 4 situs web. Apa cara terbaik & tercepat untuk beralih melalui produk dan memperbarui produk untuk memasukkan situs web baru.

Saya memiliki kode berikut namun terlalu lambat:

$ productCollection = Mage :: getModel ('catalog / product') -> getCollection ()
    -> addFieldToFilter ('sku', array ('like' => '02% '));
foreach ($ productCollection sebagai $ product) {
    echo $ product-> getSku ();
    $ product-> setWebsiteIds (array (1,2,3,4,5,6,7));
    coba {
        $ product-> save ();
        gema "- disimpan.";
    } catch (Exception $ e) {
        echo '-'. $ e-> getMessage ();
    }
    gema "\ n";
}

Saya berpikir untuk menggunakan metode iterator walk namun saya mengerti bahwa toko / situs web bukanlah atribut sehingga tidak dapat dengan mudah diperbarui sendiri.

Raj
sumber

Jawaban:

36

Langkah 1
Buat array dengan id situs web baru Anda.

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

Langkah 2
Sekarang dapatkan semua id produk.

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

Langkah 3
Tetapkan semua produk ke situs web baru:

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

Langkah 4
Merasa senang dengan diri sendiri.

Marius
sumber
1
Marius terima kasih. Jawaban sempurna. (Saya akan memilih tetapi saya belum bisa)
Raj
3
langkah 5 buat intisari: gist.github.com/mauricioprado00/2b730532689d28dcdb2b . Anda dapat melakukan "php -f shell / product-website.php - --products all --websites all" atau menentukan id situs / produk.
berguna
wow ... itu adalah solusi efisien yang luar biasa sempurna. Bahkan saya akan memutar semua produk untuk memperbaruinya. Saya ingin tahu bagaimana mempelajari konsep-konsep semacam itu tentang Magento.
Deepanshu Goyal
Dalam mode khas Marius, bekerja seperti pesona!
sparecycle
1
Produk tampaknya tidak muncul di katalog datar dan tidak terlihat di frontend. Saat menggunakan metode - save () produk muncul. Adakah yang tahu mengapa metode Marius menimbulkan masalah ini? M1.9, 4 situs web, produk 15k, katalog datar
Tom
3

Jika Anda hanya ingin menambahkan produk yang ditugaskan untuk semua 4 situs web yang sudah ada sebelumnya, gunakan ini:

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

Lihat juga: Saring produk berdasarkan situs web menggunakan AND

Ini bisa berupa skrip pengaturan Magento atau skrip PHP yang dapat dibuang (dalam hal ini tambahkan include 'app/Mage.php';di bagian atas dan hapus dari server setelah penggunaan)

Fabian Schmengler
sumber
1

Langkah 1: Dapatkan semua Id situs web / buat array dari Id situs web

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

Langkah 2: Dapatkan semua Id produk

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

Langkah 3: Tambahkan id situs web ke semua produk

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

Catatan: Jika Anda ingin menghapus situs web dari produk. gunakan hapus alih-alih tambahkan kata

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

Solusi lain jika kemalasan Anda tidak ingin membuat file PHP apa pun:

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

Bekerja untukku.

Shadowbob
sumber