Pergunta

Preciso atualizar em massa o preço especial de um arquivo CSV (que me informa o sku, o preço especial, até a data).

No momento eu faço isso usando o método de modelos magento como este (depois de analisar as linhas CSV) em um loop foreach:

$p = Mage::getModel('catalog/product');
$product_id = $p->getIdBySku($product['SKU']);
if (!$product_id) {
    throw new Exception('Product Does Not Exists');
}
$p->setStoreId($store_id)->load($product_id);
$p->setSpecialPrice(floatval($product['Price']));
$p->setSpecialFromDate($product['FromDate']);
$p->setSpecialFromDateIsFormated(true);
$p->setSpecialToDate($product['ToDate']);
$p->setSpecialToDateIsFormated(true);
$p->save();
$p = null;

Não há problema quando alguns produtos precisam de atualização.No entanto, quando você atualiza mais de 100 produtos, isso se torna incrivelmente lento e também afeta o desempenho do site.

Existe alguma maneira de importar preços especiais em massa e também definir as datas por meio de uma consulta SQL direta?


Ao pesquisar esse problema, encontrei uma solução possível (com base neste artigo http://fishpig.co.uk/magento/tutorials/update-prices-sql) com a configuração do special_price no banco de dados diretamente assim:

Observação: bd_ é o prefixo da minha tabela

UPDATE bd_catalog_product_entity AS CPE
INNER JOIN bd_catalog_product_entity_decimal AS CPED ON CPED.entity_id = CPE.entity_id
SET CPED.`value` = 2.99 -- New Special Price
WHERE
    CPED.attribute_id = (
        SELECT
            attribute_id
        FROM
            bd_eav_attribute eav
        WHERE
            eav.entity_type_id = 4
        AND eav.attribute_code = 'special_price'
    )
AND CPED.store_id = 1   -- Retail Store
AND CPE.sku = 'ABS049'  -- Sku Being Updated

Esse parece estar funcionando (posso ver o valor na UI do magento atualizada).Ainda não tenho certeza se esta é a maneira correta de definir o preço especial diretamente no banco de dados.

Além disso, ainda não descobri como definir o from/to datas.

Qualquer ajuda sobre isso será muito apreciada.

Foi útil?

Solução

Digamos que $storeId é a loja cujo preço você deseja atualizar $specialPrice é o seu preço especial, $sku é o SKU do seu produto, $fromDate e $toDate são... bem, você entendeu.

Agora execute este código:

$id = Mage::getSingleton('catalog/product')->getIdBySku($sku);
if ($id) {
    Mage::getSingleton('catalog/product_action')->updateAttributes(
        array($id), //array with ids to update
        array( //array with attributes to update
            'special_price' => $specialPrice,
            'special_from_date' => $fromDate,
            'special_to_date' => $toDate,
        ),
        $storeId //store id to update. If you want to update the global value use 0 in here
    );
}

Outras dicas

Se você deseja atualizar produtos existentes, não há necessidade de fazer alterações manualmente.Basta importar o CSV que deve conter apenas os atributos como colunas que são necessárias para atualização.SKU é um campo obrigatório, então não se esqueça de incluí-lo em seu CSV.

Importará produtos muito rapidamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top