Масові оновлення продуктів для включення нових веб-сайтів


16

Клієнт має 20000+ продуктів з 7 веб-сайтів. Раніше вони мали 4 веб-сайти, і більшість продуктів пов’язані з 4 веб-сайтами. Який найкращий та швидкий спосіб перейти через продукти та оновити продукти, щоб включити нові веб-сайти.

У мене є такий код, проте він занадто повільний:

$ productCollection = Mage :: getModel ('каталог / продукт') -> getCollection ()
    -> addFieldToFilter ('sku', масив ('як' => '02% '));
foreach ($ productCollection як $ product) {
    echo $ product-> getSku ();
    $ product-> setWebsiteIds (масив (1,2,3,4,5,6,7));
    спробуйте {
        $ product-> save ();
        відлуння "- збережено.";
    } улов (виняток $ e) {
        echo '-'. $ 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 - --products all --weets all" або вказати ідентифікатори веб-сайтів / продуктів.
марно

ух ... це надзвичайно ідеальне ефективне рішення. Навіть я збирався обійти всі ці багато продуктів, щоб оновити їх. Я хочу знати, як дізнатися такі поняття про Магенто.
Deepanshu Goyal

У типовій моді Маріуса працював як шарм!
запчастини

1
Здається, продукція не відображається в плоскому каталозі і не видно на передній панелі. При використанні методу - save () продукти відображаються. Хтось знає, чому метод Маріуса викликає цю проблему? 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. Отримайте всі ідентифікатори веб-сайту / складіть масив ідентифікаторів веб-сайту

$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

Працювали для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.