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

16

У клиента более 20000 товаров с 7 сайтами. Раньше у них было 4 веб-сайта, и большинство продуктов связано с 4 веб-сайтами. Каков наилучший и самый быстрый способ перебирать продукты и обновлять продукты для включения новых веб-сайтов.

У меня есть следующий код, однако он слишком медленный:

$ productCollection = Mage :: getModel ('catalog / product') -> getCollection ()
    -> addFieldToFilter ('sku', array ('like' => '02% '));
foreach ($ productCollection как $ product) {
    echo $ product-> getSku ();
    $ Продукт-> setWebsiteIds (массив (1,2,3,4,5,6,7));
    пытаться {
        $ Продукт-> Save ();
        эхо "- сохранено.";
    } catch (исключение $ 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 --websites all» или указать идентификаторы веб-сайтов / продуктов.
бесполезно
вау ... это удивительно совершенное эффективное решение. Даже я собирался обойти все эти многочисленные продукты, чтобы обновить их. Я хочу знать, как узнать такие понятия о Magento.
Дипаншу Гоял
В типичной манере Мариуса работал как шарм!
запасной мотоцикл
1
Продукты не отображаются в плоском каталоге и не видны на веб-интерфейсе. При использовании метода - save () продукты появляются. Кто-нибудь знает, почему метод Мариуса дает эту проблему? M1.9, 4 веб-сайта, 15 000 товаров, плоский каталог
Том
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

Работал на меня.

Shadowbob
источник