Produtos de atualização em massa para incluir novos sites


16

Um cliente tem mais de 20.000 produtos em 7 sites. Eles costumavam ter 4 sites e a maioria dos produtos está associada a 4 sites. Qual é a melhor e mais rápida maneira de percorrer os produtos e atualizá-los para incluir os novos sites.

Eu tenho o seguinte código, no entanto, é muito lento:

$ productCollection = Mage :: getModel ('catalog / product') -> getCollection ()
    -> addFieldToFilter ('sku', array ('like' => '02% '));
foreach ($ productCollection como $ product) {
    echo $ product-> getSku ();
    $ product-> setWebsiteIds (array (1,2,3,4,5,6,7));
    experimentar {
        $ product-> save ();
        eco "- salvo.";
    } catch (exceção $ e) {
        echo '-'. $ e-> getMessage ();
    }
    eco "\ n";
}

Eu estava pensando em usar o método de caminhada do iterador, mas entendo que a loja / site não é exatamente um atributo, portanto, não pode ser facilmente atualizado por conta própria.

Respostas:


36

Etapa 1
Crie uma matriz com seus novos IDs de site.

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

Etapa 2
Agora obtenha todos os IDs do produto.

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

Etapa 3
Atribua todos os produtos aos novos sites:

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

Etapa 4
Sinta-se bem consigo mesmo.


1
Obrigado Marius. Resposta perfeita. (Eu votaria, mas eu ainda não pode)
Raj

3
etapa 5, crie uma lista principal: gist.github.com/mauricioprado00/2b730532689d28dcdb2b . você pode fazer "php -f shell / product-website.php - --products all --websites all" ou especificar IDs de sites / produtos.
inútil

uau ... essa é uma solução eficiente incrivelmente perfeita. Até eu ia percorrer todos esses produtos para atualizá-los. Eu quero saber como aprender esses conceitos sobre o Magento.
Deepanshu Goyal

Na moda típica de Marius, funcionou como um encanto!
Sparecycle

1
Os produtos não parecem aparecer no catálogo plano e não são visíveis no frontend. Ao usar o método - save (), os produtos aparecem. Alguém sabe por que o método de Marius causa esse problema? M1.9, 4 sites, 15k produtos, catálogo plano
Tom

3

Se você deseja adicionar apenas os produtos atribuídos a todos os 4 sites existentes anteriormente, use este:

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

Veja também: Filtrar produtos por site usando AND

Pode ser um script de instalação do Magento ou um script PHP descartável (neste caso, adicione include 'app/Mage.php';na parte superior e remova-o do servidor após o uso)


1

Etapa 1: obter todos os IDs do site / criar uma variedade de IDs do site

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

Etapa 2: obtenha todos os códigos de produto

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

Etapa 3: adicionar IDs de site a todos os produtos

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

Nota: Se você deseja remover o site do produto. use remover em vez disso adicione palavra

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

0

Outra solução se a sua preguiça chegar ao ponto de não querer criar nenhum arquivo PHP:

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

Trabalhou para mim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.