12

How to get all products of category using category id in magento 2?

  • you want this in a block or in a model? – Marius Jan 6 '16 at 13:37
  • i want all product of category in homepage. i got already category id and based on that i want fetch all product of category – Rakesh Jesadiya Jan 6 '16 at 13:38
  • i have call block for getting category collection so its best to get in block class. – Rakesh Jesadiya Jan 6 '16 at 13:43
  • @RakeshJesadiya Sorry for posting here but I need your help on this issue magento.stackexchange.com/questions/293795/… please – Nagaraju K Oct 25 '19 at 14:03
24

you can inject in your block an instance of \Magento\Catalog\Model\CategoryFactory like this:

protected $categoryFactory;
public function __construct(
    ....
    \Magento\Catalog\Model\CategoryFactory $categoryFactory,
    ...
){
    ...
    $this->categoryFactory = $categoryFactory;
    ...
}

Then create this method in your block:

public function getCategory()
{
    $categoryId = $this->getCategoryId();
    $category = $this->categoryFactory->create()->load($categoryId);
    return $category;
}
public function getProductCollection()
{
     return $this->getCategory()->getProductCollection()->addAttributeToSelect('*'); 
}

Then you can use in the template this:

<?php foreach ($block->getProductCollection() as $product) : ?>
    <!-- do something with $product -->
<?php endforeach;?>

You should be able now to just add this to your homepage content

{{block class="Block\Class\Name\Here" category_id="5" template="path/to/template.phtml"}}
|improve this answer|||||
  • In implementing this solution i ran into the same problem posted about here: magento.stackexchange.com/questions/123374/… I'm adding this in so if others need further clarification on how to use this solution, they have one stop shopping. – circlesix Aug 11 '16 at 17:00
  • @Marius is there any way to do it via the repository pattern i.e., via the service contracts provided by Magento? – Mathanagopal S Mar 15 at 5:43
1

You need to replace getProductsCollection() by getProductCollection() (without s)

|improve this answer|||||
0

I am using this

echo '('.$subcat->getProductCollection()->count().')';

foreach ($subcats as $subcat) { 
    if ($subcat->getIsActive()) {
        $_category = $objectManager->create('Magento\Catalog\Model\Category')->load($subcat->getId());
        $_imgUrl = $_category->getImageUrl(); 
        $subcat_url = $subcat->getUrl();
        // echo $qty = $subcat->getQty(); exit;
        $subcat_img = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA) . 'catalog/category/' . $subcat->getImage(); 
        $placeholder_img = "pub/media/placeholder.png";
        if($_imgUrl ==''){
            $_imgUrl = $store->getBaseUrl(\Magento\Framework\UrlInterface::URL_TYPE_MEDIA)."catalog/category/placeholder.png";
        }
        ?>
        <div class="col-sm-2 item-two">
            <a href="<?php echo $subcat_url; ?>">
                <div class="item-two-img">
                    <img src="<?php echo $_imgUrl; ?>" class="img-responsive"/>
                </div>
                <p><?php echo $subcat->getName(); 
                    $subcat->getProductCollection()->count(); ?>
                    <span class="pro_quantity">
                        <?php echo '('.$subcat->getProductCollection()->count().')';?>
                    </span>
                </p>
            </a>
        </div>
        <?php
    }
}
|improve this answer|||||
  • Never use objectmanager in your code. especially not in in your phtmls – Kay Int Veen Sep 27 '19 at 13:32
  • What is the reason for not to use objectmanager in our code? – Kowsigan Atsayam Mar 16 at 15:57
0

You can use addCategoriesFilter function. With this function you filter by several category ids.

First you need inject CollectionFactory:

protected $_productCollectionFactory;

public function __construct(
    ....
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    ...
){
    ...
    $this->_productCollectionFactory = $productCollectionFactory;
    ...
}

Then somewhere in the code:

public function getCollectionByCategoryId($id)
{
    $ids = [$id];
    $collection = $this->_productCollectionFactory->create();
    $collection->addAttributeToSelect('*');
    $collection->addCategoriesFilter(['in' => ids]);

    return $collection;
}
|improve this answer|||||

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.