नई वेबसाइटों को शामिल करने के लिए बल्क अपडेट उत्पाद


16

एक ग्राहक के पास 7 वेबसाइटों के साथ 20000+ उत्पाद हैं। उनके पास 4 वेबसाइटें थीं और अधिकांश उत्पाद 4 वेबसाइटों से जुड़े हैं। उत्पादों के माध्यम से पुनरावृति करने के लिए सबसे अच्छा और तेज तरीका क्या है और नई वेबसाइटों को शामिल करने के लिए उत्पादों को अपडेट करें।

मेरे पास निम्नलिखित कोड है हालांकि यह बहुत धीमा है:

$ ProductCollection = Mage :: getModel ('कैटलॉग / उत्पाद') -> getCollection ()
    -> addFieldToFilter ('sku', array ('like' => '02% '));
foreach ($ उत्पाद के रूप में $ उत्पाद) {
    गूंज $ उत्पाद-> getSku ();
    $ उत्पाद-> setWebsiteIds (सरणी (1,2,3,4,5,6,7));
    प्रयत्न {
        $ उत्पाद-> सहेजें ();
        प्रतिध्वनि "- बचाया;"
    } पकड़ (अपवाद $ ई) {
        गूंज '-'। $ e-> getMessage ();
    }
    गूंज "\ n";
}

मैं इटरेटर वॉक विधि का उपयोग करने के बारे में सोच रहा था लेकिन मैं समझता हूं कि स्टोर / वेबसाइट वास्तव में एक विशेषता नहीं है, इसलिए इसे आसानी से अपडेट नहीं किया जा सकता है।

जवाबों:


36

चरण 1
अपनी नई वेबसाइट आईडी के साथ एक सरणी बनाएँ।

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

चरण 2
अब सभी उत्पाद आईडी प्राप्त करें।

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

चरण 3
सभी उत्पादों को नई वेबसाइटों पर असाइन करें:

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

चरण 4
अपने बारे में अच्छा महसूस करें।


1
धन्यवाद मारियस। एकदम सही जवाब। (मैं मतदान करूंगा लेकिन मैं अभी तक नहीं कर सकता)
राज

3
चरण 5 एक जिस्ट बनाएं: gist.github.com/mauricioprado00/2b730532689d28dcdb2b । आप "php -f shell / product-website.php - --propros all --websites all" या वेबसाइट्स / प्रोडक्ट आईडी निर्दिष्ट कर सकते हैं।
बेकार

वाह ... यह एक अद्भुत पूर्ण कुशल समाधान है। यहां तक ​​कि मैं उन्हें अद्यतन करने के लिए उन सभी उत्पादों के आसपास लूप करने जा रहा था। मैं जानना चाहता हूं कि मैगेंटो के बारे में ऐसी अवधारणाएं कैसे सीखें।
दीपांशु गोयल

ठेठ मारियस फैशन में, एक आकर्षण की तरह काम किया!
sparecycle

1
उत्पाद फ्लैट कैटलॉग में दिखाई नहीं देते हैं और दृश्यपटल पर दिखाई नहीं देते हैं। जब - सेव () विधि का उपयोग करते हैं तो उत्पाद दिखाई देते हैं। क्या किसी को पता है कि मारियस का तरीका यह समस्या क्यों देता है? M1.9, 4 वेबसाइट, 15k उत्पाद, फ्लैट कैटलॉग
टॉम

3

यदि आप केवल उन उत्पादों को जोड़ना चाहते हैं जो सभी पहले से मौजूद 4 वेबसाइटों को दिए गए हैं, तो इसका उपयोग करें:

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

इसे भी देखें: AND का उपयोग करके उत्पादों को फ़िल्टर करें

यह एक Magento सेटअप स्क्रिप्ट या एक थ्रो PHP स्क्रिप्ट हो सकता है (इस मामले include 'app/Mage.php';में सबसे ऊपर जोड़ें और उपयोग के बाद इसे सर्वर से हटा दें)


1

चरण 1: सभी वेबसाइट Ids प्राप्त करें / वेबसाइट Ids की सरणी बनाएं

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

चरण 2: सभी उत्पाद Ids प्राप्त करें

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

चरण 3: सभी उत्पादों के लिए वेबसाइट आईडी जोड़ें

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

नोट: यदि आप वेबसाइट को उत्पाद से हटाना चाहते हैं। शब्द जोड़ने के बजाय हटाने का उपयोग करें

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

0

एक और समाधान अगर आपका आलस्य किसी भी PHP फ़ाइलों को बनाने की इच्छा नहीं करता है, तो:

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

मेरे लिए काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.