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””