Obter coleção de produtos por categoria raiz e todas as suas subcategorias no Magento 2?

7

Como recuperar uma coleção de produtos por uma categoria raiz e de todas as suas subcategorias?

Por exemplo:

Categoria raiz (2 produtos)

  • Subcategoria 1 (2 produtos)
  • Subcategoria 2 (3 produtos)

Então, eu quero recuperar todos os 7 produtos da coleção.

nuwaus
fonte

Respostas:

3

Você pode usar assim:

/** \Magento\Catalog\Api\CategoryRepositoryInterface */
protected $categoryRepository;

/** \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory */
protected $productCollectionFactory;

public function getAllProductOfSubcategories($categoryId, $storeId = null) {

    /** @var $result \Magento\Catalog\Model\ResourceModel\Product\Collection */
    $result = $this->productCollectionFactory->create();

    //get category at $storeId 
    try {
        $category = $this->categoryRepository->get($categoryId, $storeId);
    } catch (\Magento\Framework\Exception\NoSuchEntityException $noSuchEntityException) {
        return null;
    }

    return $result->addCategoryFilter($category);
}

* Nota: sua categoria deve ativar a âncora

Ativar âncora para categoria

* Nota: execute php bin/magento indexer:reindexapenas para ter certeza

Rubelia
fonte
2

Código para o seu arquivo de classe:

protected $_categoryHelper;
protected $_categoryRepository;

public function __construct(
    \Magento\Catalog\Helper\Category $categoryHelper,
    \Magento\Catalog\Model\CategoryRepository $categoryRepository,
    array $data = []
)
{
    $this->_categoryHelper = $categoryHelper;
    $this->_categoryCategoryRepository = $categoryRepository;        
    parent::__construct($context, $data);
}

public function getStoreCategories() 
{
    return $this->_categoryHelper->getStoreCategories();
}

public function getCategory($categoryId)
{
    return $this->_categoryRepository->get($categoryId);
}

Código para o seu arquivo de modelo:

$categories = $block->getStoreCategories();
foreach ($categories as $category) {
    echo $category->getName();
    echo ' ( ' . $category->getProductCount() . ' )';

    $subCategories = $block->getCategory($category->getId());
    foreach ($subCategories as $subCategory) {
        echo $subCategory->getName();
        echo ' ( ' . $subCategory->getProductCount() . ' )';
    }
}

Fonte: Magento 2: obtenha categoria pai, categorias filhos e contagem de produtos

Mukesh Chapagain
fonte
1

Eu resolvi como abaixo,

protected $_category;
protected $_productCollection;

/** You should provide your root category here, and it will return comma seperated sub category list */
public function getChildren($categoryId = false)
{
    if ($this->_category) {
        return $this->_category->getChildren();
    } else {
        return $this->getCategory($categoryId)->getChildren();
    }        
}    

protected function _getProductCollection()
{
    $childListStr   = $this->getChildren( 2 ); // Provide the root category ID
    $childList      = explode( ",", $childListStr );
    $catToLoad      = array();

    foreach( $childList as $item ){
        array_push( $catToLoad, $item );
    }

    if ($this->_productCollection === null) {
        $layer = $this->getLayer();
        $this->_productCollection = $layer->getProductCollection();            
    }

    $this->_productCollection->addCategoriesFilter(['in' => $catToLoad ]);  
    return $this->_productCollection;
}
nuwaus
fonte
0

Oi eu tenho outra maneira de obter coleção de produtos da categoria raiz ... confira .. Espero que isso ajude

public function __construct(
    \Magento\Catalog\Model\Layer\Category $categoryLayer    
){
      $this->_categoryLayer = $categoryLayer;
}

public function getProductCollection($category){
     return $this->_categoryLayer->setCurrentCategory($category)->getProductCollection();
}
HoangHieu
fonte
-5

Tente isto

 $category = Mage::getModel('catalog/category')->load(2);
 $children = Mage::getModel('catalog/category')->getCollection()->setStoreId(Mage::app()->getStore()->getId());
 $children->addAttributeToSelect('*')
          ->addAttributeToFilter('parent_id', $category->getId())
          ->addAttributeToFilter('is_active', 1)
          ->addAttributeToSort('position');
foreach($children as $child)
{

   $category=Mage::getModel('catalog/category')->load($child->entity_id);
}
Ravi Thanki
fonte
4
Esta é a maneira Magento 1.
precisa saber é o seguinte