Этот код позволит вам фильтровать по нескольким категориям, но избежать полного снижения производительности, если вам пришлось выполнять несколько загрузок сбора:
$iNumberFeaturedItems = 4;
$oCurrentCategory = Mage::registry('current_category');
$oFeaturedCategory = Mage::getModel('catalog/category')->getCollection()
->addAttributeToFilter('name','Featured')
->getFirstItem();
$aFeaturedCollection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect(array('name', 'price', 'small_image', 'url_key'), 'inner')
->addStoreFilter()
->addCategoryFilter($oFeaturedCategory)
->addCategoryIds();
Первый шаг - получить набор продуктов для одной категории (в этом случае, Избранные категории).Следующим шагом является получение идентификаторов продуктов, обратите внимание, что это НЕ выполняет загрузку (ref Mage_Core_Model_Mysql4_Collection_Abstract::getAllIds()
)
$aFeaturedProdIds = $aFeaturedCollection->getAllIds();
shuffle($aFeaturedProdIds); //randomize the order of the featured products
Затем получите идентификаторы для второй категории:
$aCurrentCatProdIds = $oCurrentCategory->getProductCollection()->getAllIds();
И пересекают массивы, чтобы найти идентификаторы продуктов, которые существуют в обеих категориях:
$aMergedProdIds = array_intersect($aFeaturedProdIds,$aCurrentCatProdIds);
Для этого конкретного случая использования мы выполняем цикл, пока не получим достаточное количество пересекающихся продуктов, перебирая категориюдерева, пока мы не найдем достаточно большое совпадение (но остановимся на корневой категории!):
while(count($aMergedProdIds) < $iNumberFeaturedItems && $oCurrentCategory->getId() != Mage::app()->getStore()->getRootCategoryId()):
$oCurrentCategory = $oCurrentCategory->getParentCategory();
$aParentCatProdIds = $oCurrentCategory->getProductCollection()->getAllIds();
$aMergedProdIds = array_intersect($aFeaturedProdIds,$aParentCatProdIds);
endwhile;
Наконец, отфильтруйте нашу первоначальную коллекцию по идентификаторам пересекающихся продуктов и вернитесь.
$aFeaturedItems = $aFeaturedCollection->addIdFilter(array_slice($aMergedProdIds,0,$iNumberFeaturedItems))->getItems();
return $aFeaturedItems;