One of our clients has a specific requirement to show some products(let's say 4 or 5) in the home page that are being viewed at the moment by other users. Your suggestions about how to begin with this would be greatly appreciated. Thanks.
2 Answers
Obviously you need a time limit for the viewed products.
Let's say you want to show the products viewed in the last 5 minutes.
You can modify the value to fit your own needs.
See my comments for each line:
//number of minutes to search viewed products
$minutes = 5;
//number of products to be shown
$limit = 5;
//instance of a date model to get the timestamps
/** @var Mage_Core_Model_Date $dateModel */
$dateModel = Mage::getModel('core/date');
//get the current date
$now = $dateModel->gmtDate();
//get the date X minutes ago
$pastDate = $dateModel->gmtDate(null, $dateModel->timestamp() - $minutes * 60);
//get the viewed products collection
/** @var Mage_Reports_Model_Resource_Product_Viewed_Collection $collection */
$collection = Mage::getResourceModel('reports/product_viewed_collection');
//set the time filter between now and X minutes ago
$collection->setDateRange($pastDate, $now);
//add minimum data to the product collection - prices, tax percents, and core attributes
$collection->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addUrlRewrite();
//set a filter for the current website only - I know it says store it, but it actually filters by website
$collection->setStoreIds(array(Mage::app()->getStore()->getId()));
//in case you are showing this on a product page and you want to exclude the current product from the list uncomment the line below
//$collection->addAttributeToFilter('entity_id', array('neq'=>Mage::registry('current_product')->getId()));
//set the limit to Y products
$collection->setPage(1, $limit);
//do something with the product collection
foreach ($collection as $product) {
echo $product->getId().'--'.$product->getName().'--'.$product->getProductUrl().'--'.$product->getFinalPrice().'<br />';
}
Wrap everything in one method and enjoy.
This might help (giving you the last 10 viewed products):
<?php
$collection = Mage::getModel('reports/product_index_viewed')
->getCollection()
->addAttributesToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->setAddedAtOrder()
->addPriceData()
->setPageSize(10)
->setCurPage(1)
;