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.
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.
$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
$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