In this post I am going to explain how to get product collection by category in magento 2.
1. Using Dependency Injection
Add below code snippet in Block class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | protected $_categoryFactory; protected $_productCollectionFactory; public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Catalog\Model\CategoryFactory $categoryFactory, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, array $data = [] ) { $this->_categoryFactory = $categoryFactory; $this->_productCollectionFactory = $productCollectionFactory; parent::__construct($context, $data); } /* Get category object */ public function getCategory($categoryId) { $category = $this->_categoryFactory->create(); $category->load($categoryId); return $category; } /* Product collection by category id */ public function getCategoryProductCollection($categoryId) { $productCollection = $this->getCategory($categoryId)->getProductCollection(); $productCollection->addAttributeToSelect('*'); $productCollection->addAttributeToFilter('visibility', \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH); $productCollection->addAttributeToFilter('status',\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED); return $productCollection; } /* Filtering a product collection by multiple category ids */ public function getProductCollectionByCategories($categoryIds) { $productCollection = array(); if ($categoryIds && count($categoryIds) > 0) { $productCollection = $this->_productCollectionFactory->create(); $productCollection->addAttributeToSelect('*'); $productCollection->addCategoriesFilter(['in' => $categoryIds]); $productCollection->addAttributeToFilter('visibility', \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH); $productCollection->addAttributeToFilter('status', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED); } return $productCollection; } |
Add below code snippet in template file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | $categoryId = 3; $categoryProductCollection = $block->getCategoryProductCollection($categoryId); echo "<pre>"; print_r($categoryProductCollection->getData()); echo "</pre>"; if ($categoryProductCollection && count($categoryProductCollection) > 0) { foreach ($categoryProductCollection as $product) { echo $product->getId() . "<br />"; echo $product->getName() . "<br />"; echo $product->getProductUrl() . "<br />"; } } //Category ids array $categoryIds = [7, 8, 9]; $productCollectionByCategories = $block->getProductCollectionByCategories($categoryIds); echo "<pre>"; print_r($productCollectionByCategories->getData()); echo "</pre>"; if ($productCollectionByCategories && count($productCollectionByCategories) > 0) { foreach ($productCollectionByCategories as $product) { echo $product->getId() . "<br />"; echo $product->getName() . "<br />"; echo $product->getProductUrl() . "<br />"; } } |
2. Using Object Manager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $categoryId = 3; $categoryFactory = $objectManager->get('\Magento\Catalog\Model\CategoryFactory'); // Get category object $category = $categoryFactory->create()->load($categoryId); // Product collection by category id $categoryProductCollection = $category->getProductCollection(); $categoryProductCollection->addAttributeToSelect('*'); $categoryProductCollection->addAttributeToFilter('visibility', \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH); $categoryProductCollection->addAttributeToFilter('status', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED); echo "<pre>"; print_r($categoryProductCollection->getData()); echo "</pre>"; if ($categoryProductCollection && count($categoryProductCollection) > 0) { foreach ($categoryProductCollection as $product) { echo $product->getId() . "<br />"; echo $product->getName() . "<br />"; echo $product->getProductUrl() . "<br />"; } } $productCollectionFactory = $objectManager->get('\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory'); //Category ids array $categoryIds = [7, 8, 9]; // Filtering a product collection by multiple category ids $productCollectionByCategories = $productCollectionFactory->create(); $productCollectionByCategories->addAttributeToSelect('*'); $productCollectionByCategories->addCategoriesFilter(['in' => $categoryIds]); $productCollectionByCategories->addAttributeToFilter('visibility', \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH); $productCollectionByCategories->addAttributeToFilter('status', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED); echo "<pre>"; print_r($productCollectionByCategories->getData()); echo "</pre>"; if ($productCollectionByCategories && count($productCollectionByCategories) > 0) { foreach ($productCollectionByCategories as $product) { echo $product->getId() . "<br />"; echo $product->getName() . "<br />"; echo $product->getProductUrl() . "<br />"; } } |
Thats it. Enjoy Magento 2!!
Leave a Reply