อัปเดตผลิตภัณฑ์จำนวนมากเพื่อรวมเว็บไซต์ใหม่


16

ลูกค้ามีผลิตภัณฑ์มากกว่า 20,000 รายการพร้อมด้วย 7 เว็บไซต์ เคยมี 4 เว็บไซต์และผลิตภัณฑ์ส่วนใหญ่เชื่อมโยงกับ 4 เว็บไซต์ เป็นวิธีที่ดีที่สุดและเร็วที่สุดในการวนซ้ำผลิตภัณฑ์และอัปเดตผลิตภัณฑ์เพื่อรวมเว็บไซต์ใหม่ ๆ

ฉันมีรหัสต่อไปนี้ แต่มันช้าเกินไป:

$ productCollection = Mage :: getModel ('แคตตาล็อก / ผลิตภัณฑ์') -> getCollection ()
    -> addFieldToFilter ('sku', อาร์เรย์ ('like' => '02% '));
foreach ($ productCollection เป็น $ product) {
    echo $ product-> getSku ();
    $ ผลิตภัณฑ์> setWebsiteIds (array (1,2,3,4,5,6,7));
    ลอง {
        $ ผลิตภัณฑ์> บันทึก ();
        echo "- บันทึกแล้ว";
    } catch (ข้อยกเว้น $ e) {
        echo '-'. $ e-> getMessage ();
    }
    echo "\ 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
ขอบคุณ Marius คำตอบที่สมบูรณ์แบบ (ฉันจะลงคะแนน แต่ยังไม่สามารถทำได้)
Raj

3
ขั้นตอนที่ 5 สร้างสรุปสาระสำคัญดังนี้gist.github.com/mauricioprado00/2b730532689d28dcdb2b คุณสามารถทำ "php -f shell / product-website.php - - สินค้าทั้งหมด - เว็บไซต์ทั้งหมด" หรือระบุรหัสเว็บไซต์ / ผลิตภัณฑ์
ไร้ประโยชน์

ว้าว ... นั่นเป็นทางออกที่มีประสิทธิภาพสมบูรณ์แบบอย่างน่าอัศจรรย์ แม้ฉันจะวนรอบผลิตภัณฑ์มากมายเหล่านั้นเพื่ออัปเดต ฉันต้องการทราบวิธีการเรียนรู้แนวคิดดังกล่าวเกี่ยวกับ Magento
Deepanshu Goyal

ตามแบบฉบับของ Marius ทำงานเหมือนมีเสน่ห์!
59

1
ผลิตภัณฑ์ดูเหมือนจะไม่ปรากฏในแคตตาล็อกแฟลตและไม่สามารถมองเห็นได้ในส่วนหน้า เมื่อใช้เมธอด - save () ผลิตภัณฑ์จะปรากฏขึ้น ไม่มีใครรู้ว่าทำไมวิธีการของมาริอุสทำให้เกิดปัญหานี้หรือไม่? M1.9, 4 เว็บไซต์, ผลิตภัณฑ์ 15k, แค็ตตาล็อกเรียบ
Tom

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

นี่อาจเป็นสคริปต์การตั้งค่าวีโอไอพีหรือสคริปต์ PHP แบบโยนทิ้ง (ในกรณีนี้เพิ่มinclude 'app/Mage.php';ที่ด้านบนและลบออกจากเซิร์ฟเวอร์หลังการใช้งาน)


1

ขั้นตอนที่ 1: รับรหัสเว็บไซต์ทั้งหมด / จัดทำรหัสเว็บไซต์

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

ขั้นตอนที่ 2: รับรหัสผลิตภัณฑ์ทั้งหมด

$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

ทำงานให้ฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.