14

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

4
  • 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 Jan 6 '16 at 13:38
  • i have call block for getting category collection so its best to get in block class. 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
27

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"}}
2
  • 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? Mar 15 '20 at 5:43
1

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

0
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
    }
}
2
  • Never use objectmanager in your code. especially not in in your phtmls Sep 27 '19 at 13:32
  • What is the reason for not to use objectmanager in our code? Mar 16 '20 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;
}
0

Better and more actual way to get products by category - via ProductRepository and built-in Filters (from Magento 2.2)

public function __construct(
    ProductRepositoryInterface $productRepository,
    SearchCriteriaBuilder $criteriaBuilder
) {
    $this->productRepository = $productRepository;
    $this->criteriaBuilder = $criteriaBuilder;
}

/**
 * @return ProductInterface[]
 */
public function getProducts(): array
{
    $categoryIdsToExport = $this->config->getCategoriesToExport();

    return $this->productRepository->getList(
        $this->criteriaBuilder
            //It's Custom Filter from Magento_Catalog::di.xml
            ->addFilter('category_id', $categoryIdsToExport, 'in') 
            //Here you cat filter products in standart Magento way
            ->addFilter('status', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
            ->addFilter('visibility', \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH)
            ->create()
    )->getItems();
}

Unfortunately There are few info in stackexchange about "Search Criteria Unify Processing" - better and currently proper way to filter,sort models.

Here Magento doc about Search Criteria Unify Processing

Also you can register your own CustomFilter to filter products. See example in vendor/magento/module-catalog/etc/di.xml :

<virtualType name="Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\ProductFilterProcessor" type="Magento\Eav\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor">
    <arguments>
        <argument name="customFilters" xsi:type="array">
            <!-- You can specify your attribute and map a class to apply filter -->
            <item name="category_id" xsi:type="object">Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\ProductCategoryFilter</item>
            <item name="store" xsi:type="object">Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\ProductStoreFilter</item>
            <item name="store_id" xsi:type="object">Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\ProductStoreFilter</item>
            <item name="website_id" xsi:type="object">Magento\Catalog\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor\ProductWebsiteFilter</item>
        </argument>
    </arguments>
</virtualType>

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.