Um exemplo prático de como montar uma lista com os produtos mais vendidos no Magento.
Além disso, no exemplo terá a opção de filtrar os produtos por um conjunto de categorias.
Vamos ao código fonte.
1° – Montando a “collection”.
$_productCollection = Mage::getModel('catalog/product')->getCollection() ->addAttributeToSelect('*') ->addAttributeToFilter('status', 1) ->addAttributeToFilter('visibility', 4) ->addStoreFilter();
Na primeira parte, estamos montando uma “collection” apenas com os produtos ativos e com visibilidade “catálogo e busca”.
2° – Preparando as categorias para filtragem.
$exploded_cats = explode(",",$_POST['cats']);
Na variável POST, “cats”, estou recebendo o ID das categorias separados por virgula, exemplo “4,6,23,49” e utilizando o explode para transformar a string em um Array.
$catfilters = $exploded_cats; $conditions = array(); foreach ($catfilters as $categoryId) { if (is_numeric($categoryId)) { $conditions[] = "{{table}}.category_id = $categoryId"; } }
Já no código acima, estou “correndo” pelo meu array com os ids das categorias e montando um segundo array, “conditions” que irei utilizar para filtrar minha “collection”.
$_productCollection->distinct(true) ->joinField('category_id', 'catalog/category_product', null, 'product_id = entity_id', implode(" OR ", $conditions), 'inner');
Utilizando o método “joinField”, converto o array “conditions” em uma unica string com o método “implode” para filtrar os produtos.
3° – Definindo um limite e a visão/loja
$storeId = (int) Mage::app()->getStore()->getId(); $_productCollection->setPageSize($limit)->setCurPage($page);
Na variável “storeId”, guardo o ID da loja para utilizar na query final.
Já na segunda linha, defino um limite de registros a serem retornados, você pode substituir a variável “limit” por qualquer número inteiro.
Na mesma linha, no método “setCurPage” defino a página que desejo exibir.
Explicação rápida.
Imagina que você terá 40 registros nesta consulta e você deseja que nosso código retorne apenas os 5 produtos mais vendidos.
Então, você define o limite para “5” no “setPageSize” e no “setCurPage” o valor 1.
Caso você queira pular os 5 primeiros por exemplo, no “setCurPage” você passa o valor 2, e assim por diante.
4° – A consulta final
$_productCollection->getSelect() ->joinLeft( array('aggregation' => $_productCollection->getResource()->getTable('sales/bestsellers_aggregated_monthly')), "e.entity_id = aggregation.product_id AND aggregation.store_id={$storeId}", array('SUM(aggregation.qty_ordered) AS sold_quantity') ) ->group('e.entity_id') ->order(array('sold_quantity DESC', 'e.created_at'));
Essa é a consulta final.
No parâmetro “order”, estou ordenando primeiramente pela quantidade vendida e caso haja empate, pela data de criação do produto.
5° – Percorrendo o resultado
foreach ($_productCollection as $_product){ // $_product->getName() }
É só utilizar a variável “_productCollection” em um “foreach”, você pode acessar os atributos do produto no objeto “_product”.
Caso você não queira que sua listagem dos produtos mais vendidos no Magento seja filtrada pelas categorias é só pular o passo 2°.
Testado na versão Magento 1.9.


2 comentários sobre “Produtos mais vendidos – Magento “best sellers””