Marlon Creative
Marlon Creative

Reputation: 3846

Magento - How to filter a product collection using 2 category filters?

Does anyone know if there is a way to run a product collection through a category filter twice? I have a ‘featured’ category, which is hidden, that I add products to so they’re available to grab as featured products. Currently I'm getting my product collection like this:

$_productCollection = Mage::getResourceModel('reports/product_collection')
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('visibility', $visibility)
    ->addCategoryFilter('36');
    $_productCollection->load();

This works fine on the homepage, but on the category pages, I need to filter the results by the current category first, and then by the featured category:

$_productCollection = Mage::getResourceModel('reports/product_collection')
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('visibility', $visibility)
    ->addCategoryFilter('15')
    ->addCategoryFilter('36');
    $_productCollection->load(); 

Unfortunately, it seems you can’t perform 2 category filters without editing core files, which I don’t want to do.

Any ideas how to get around this?

I was thinking I could maybe grab 2 product collections separately, one filtered by current category, and one by featured category, then using PHP's stristr find the products residing in both and use those, like

  if (stristr($featProductCollection, $currProductCollection))

Anyone any ideas? I think I’d need to return maybe just the SKU’s of the products, maybe in a comma separated list. But I’m not sure of the best way to go about this, and it does seem a bit hacky.

Upvotes: 7

Views: 19564

Answers (2)

Igor R.
Igor R.

Reputation: 518

Not sure why, but this doesn't work in 1.4, my solution was not very beautiful but work well on large database:

$select  = $collection->getSelect();
$select->where('(SELECT COUNT(1) FROM `catalog_category_product_index` AS `cat_index`
WHERE cat_index.product_id=e.entity_id AND cat_index.category_id
IN('.implode(',',$categories).') AND cat_index.store_id='.$collection->getStoreId().') >= '.count($categories));

Upvotes: 0

Marlon Creative
Marlon Creative

Reputation: 3846

OK, actually sorted it myself with a bit of help from someone elsewhere:

    $_productCollection = Mage::getResourceModel('reports/product_collection')
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('visibility', $visibility)
    ->addCategoryFilter($_category)
    ->addAttributeToFilter('category_ids',array('finset'=>'36'))
    $_productCollection->load();

Where $_category is the current category.

Upvotes: 6

Related Questions