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!!