web-dev-qa-db-ja.com

Magentoで製品のカテゴリを取得する方法

製品のカテゴリに基づいて、Magento Google Baseの出力にproduct_typeを追加しようとしていますが、できないようです。私は次のコードを持っています:

// Get categories from  product to include as product_type
$categoryIds = $object->getCategoryIds();
foreach($categoryIds as $categoryId) {
    $category = Mage::getModel('catalog/category')->load($categoryId);
    $this->_setAttribute('product_type', $category->getName(), 'text' );
}

問題は、製品のカテゴリだけでなく、カテゴリのallを返すことです。誰にも解決策はありますか?

33
Joost de Valk

上記のRaoによってドロップされたソースリンクを使用すると、実際により良い答えが見つかりました。

$product = Mage::getModel('catalog/product')->load($productId);

$cats = $product->getCategoryIds();
foreach ($cats as $category_id) {
    $_cat = Mage::getModel('catalog/category')->load($category_id) ;
    echo $_cat->getName();
} 
60
Joost de Valk

これはまったくテストされていません。

//load the product 

$product = Mage::getModel('catalog/product')->load($productId);

//load the categories of this product 

$categoryCollection = $product->getCategoryCollection();

その後、配列のように$categoryCollectionをループできます。

source

46
Rao

@Raoによるソリューションは、SQL IDを1回しか呼び出さないため、カテゴリIDを取得する製品オブジェクトがある場合に最適であることを指摘しておきます。

カテゴリIDだけがある場合は、次のことができます。

$categories = Mage::getModel('catalog/category')
    ->getCollection()
    ->addAttributeToSelect('name') //you can add more attributes using this
    ->addAttributeToFilter('entity_id', array('in'=>array(1,2,3)));

foreach($categories as $_cat){
    $holder[]= $_cat->getName();
}

ここで、array(1,2,3)はカテゴリです。配列には文字列値ではなく整数が含まれていることに注意してください。SQLはそれについて気難しいかもしれません。

また、一度に1つのカテゴリをプルするソリューションは、ループのすべての反復に対してSQL呼び出しを行うため、非常に非効率的であることを指摘したいと思いました。

foreach(..){
    Mage::getModel('catalog/category')->load($categoryId);
}
6
augsteyer

製品のすべてのカテゴリを取得

<?php
    $_Product = Mage::getModel("catalog/product")->load( PRODUCT_ID );
    $categoryIds = $_Product->getCategoryIds();//array of product categories

    foreach($categoryIds as $categoryId) {
      $category = Mage::getModel('catalog/category')->load($categoryId);
      $this->_setAttribute('product_type', $category->getName(), 'text' );
   } 
?>
5
ravi patel

Raoのソリューションはすべての属性をロードしようとします。つまり、多くのクエリと結合を意味しますが、必要なのはproduct_idカテゴリをロードします。だからあなたはこれを行うことができます:

  $product = Mage::getModel("catalog/product")->setId($productId);
  $categories = $product->getCategoryCollection();

これは製品をロードせず、カテゴリを提供します。

1
shampoo

このコードは、Magento 2のphtmlファイルで機能します。

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$product = $objectManager->get('Magento\Framework\Registry')->registry('current_product');//get current product
$categories = $product->getCategoryIds(); /*will return category ids array*/  
0