web-dev-qa-db-ja.com

プログラムでMagento製品をカテゴリに追加する

Magento 1.4.0.1を使用しています。私は21000以上のシンプルな製品を持っていますが、それぞれが1つのカテゴリーに入りました。私のサイトには何百ものカテゴリがあります。一部の製品は複数のカテゴリに属しています。プログラムで製品を複数のカテゴリに追加する方法はありますか?

18
robgt

PHPコードでは、それらをインポートしている間にカテゴリに入れることができます。

$ productという製品と$ category_idというカテゴリIDがあるとします。

次のようにして、製品が属するカテゴリを設定できます。

_$categories = array($category_id);
$product->setCategoryIds($categories);
$product->save();
_

製品にすでにカテゴリがあり、さらに1つ追加したい場合は、次のようにgetCategoryIds()を使用できます。

_$categories = $product->getCategoryIds();
$categories[] = $categoryId;
$product->setCategoryIds($categories);
$product->save();
_

または、コメントでJoshua Peckが述べたように、_category_api_モデルを使用して、現在のカテゴリの割り当てに影響を与えずに、カテゴリに製品を追加または削除できます。

_Mage::getSingleton('catalog/category_api')
  ->assignProduct($category->getId(),$p‌​roduct->getId());

Mage::getSingleton('catalog/category_api')
  ->removeProduct($category->getId(),$p‌​roduct->getId());
_
52
Josh Pennington

GetSingletonカテゴリAPIで削除および追加できることを追加したいだけです。

カテゴリーから製品を削除するには:

Mage::getSingleton('catalog/category_api')->removeProduct($category->getId(),$p‌​roduct->getId());

製品をカテゴリに追加するには:

Mage::getSingleton('catalog/category_api')->assignProduct($category->getId(),$p‌​roduct->getId());

これにより、製品がすでに存在するカテゴリは上書きされません

18
Joshua Pack

モジュールを作成することもできます(時間がかかりますが、データのインポートは高速になる可能性があります)。APIを使用して何かを作成することもできます(Magentoプログラミングの関与は少なくなりますが、データのインポートが低速になる可能性があります)。

あなたが知っているもののあなたの出発点、あなたの時間はどれほど価値があるか、そしてどれくらいの頻度でアップデートを実行する必要があるかはあなたの選択を決定するでしょう。

以下は、カテゴリーに製品を追加するためのMagento APIのドキュメントです(ページ下部の例を参照)。

http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_category

2
ʍǝɥʇɐɯ

Magento APIを調べた後、Magentoは次の方法で製品をカテゴリに追加します。

public function assignProduct($categoryId, $productId, $position = null, $identifierType = null)
{
    $category = $this->_initCategory($categoryId);
    $positions = $category->getProductsPosition();
    $productId = $this->_getProductId($productId);
    $positions[$productId] = $position;
    $category->setPostedProducts($positions);

    try {
        $category->save();
    } catch (Mage_Core_Exception $e) {
        $this->_fault('data_invalid', $e->getMessage());
    }

    return true;
}

そして、すべての割り当てられた製品を取得します:

public function assignedProducts($categoryId, $store = null)
{
    $category = $this->_initCategory($categoryId);

    $storeId = $this->_getStoreId($store);
    $collection = $category->setStoreId($storeId)->getProductCollection();
    ($storeId == 0)? $collection->addOrder('position', 'asc') : $collection->setOrder('position', 'asc');;

    $result = array();

    foreach ($collection as $product) {
        $result[] = array(
            'product_id' => $product->getId(),
            'type'       => $product->getTypeId(),
            'set'        => $product->getAttributeSetId(),
            'sku'        => $product->getSku(),
            'position'   => $product->getPosition()
        );
    }

    return $result;
}
1
Paul Hachmang

上記の最良の答えは、Mage::getSingleton('catalog/category_api') ->assignProduct($category->getId(),$p‌​roduct->getId());を使用することです

とにかく、更新する製品/カテゴリがたくさんある場合、その機能はかなり遅いです。

これは、API関数assignProduct()が原因です。

  • 一度に1つの製品/カテゴリのみを受け入れます
  • 呼び出しごとに製品とカテゴリをロードしてから、カテゴリを保存します
    (同じカテゴリを複数回更新する必要がある場合、非常に遅くなります)

たとえば、10個の製品を1つのカテゴリに割り当てたいとします。同じカテゴリを10回ロードして保存するとします。
(製品IDが正しいことが確かな場合は、実際に必要ではないすべての製品をロードします)

より速い方法
以下の関数はapiと同じですが、カテゴリーのみをロードして保存します1回

この関数は、配列をパラメーター_$data_として受け入れます。これには、すべての収集変更を$category_id => array(all the products you want to assign)の形式で含める必要があります。

たとえば、_store_id_のパラメーター(関数はデフォルトで0を使用)および位置情報を製品に追加するなど、ニーズに合わせてカスタマイズするのは簡単です...

カテゴリを追加

_function assignCategories($data)
{
    foreach ($data as $cat_id => $products_ids) {
        /** @var  $category Mage_Catalog_Model_Category */
        $category = Mage::getModel('catalog/category')
            ->setStoreId(0)
            ->load($cat_id );

        $positions = $category->getProductsPosition();
        foreach ($products_ids as $pid) {
            $positions[$pid] = null;
        }
        $category->setPostedProducts($positions);
        $category->save();
    }
}
_

カテゴリを削除

_function removeProduct($data)
{
    foreach ($data as $cat_id => $products_ids) {
        /** @var  $category Mage_Catalog_Model_Category */
        $category = Mage::getModel('catalog/category')
            ->setStoreId(0)
            ->load($cat_id);

        $positions = $category->getProductsPosition();
        foreach ($products_ids as $pid) {
            unset($positions[$pid]);
        }
        $category->setPostedProducts($positions);
        $category->save();
    }
}
_

カテゴリを保存すると、_Category Flat Data_および_Catalog URL Rewrites_の再インデックスがトリガーされます(これらが_update on save_として設定されている場合)。
これは正確には高速ではありません(API呼び出しも同じです)...
...変更を実行する前に手動で更新するようにこれらの再インデックスを設定し、その後、それらに対して完全な再インデックスを実行することができます。
(更新するカテゴリ/製品の数によっては、これが最適なオプションになる可能性があります)

1
WonderLand

まあ私は怠惰のいくつかの理由のためにAPIでこれを行うことになりました。これにより、すべての表示可能な製品がID 146のカテゴリに追加されます。

<?php
  $client= new SoapClient('http://www.example.com/api/soap/?wsdl', array('trace' => 1, "connection_timeout" => 120));

  // Can be added in Magento-Admin -> Web Services with role set to admin

  $sess_id= $client->login('apiuser', 'apikey');

  // Get the product list through SOAP
  $filters = array('visibility' => '4', 'status' => '1');
  $all_products=$client->call($sess_id, 'product.list', array($filters));

  // Now chuck them into category 146

  foreach($all_products as $product)
  {  //var_dump($product);
      echo $product['sku']."\n";
      $doit=$client->call($sess_id, 'category.assignProduct', array('146', $product['sku']));
  }
?>
1
ʍǝɥʇɐɯ

Magentoスクリプトを使用して、プログラムでカテゴリに複数の製品を割り当てることができます。カテゴリの配列を作成し、カスタム属性またはフィールドに基づいて製品を選択してください。

$newproducts = $product->getCollection()->addAttributeToFilter(array(array('attribute'=>'attribute_label', 'eq'=> 'attribute_id')));

以下に示すように、製品をループしてカテゴリに割り当てます。

$newCategory = array( $list[0] , $list[$key]); 
foreach ($newproducts as $prod)
{
    $prod->setCategoryIds(array_merge($prod->getCategoryIds(), $newCategory));
    $prod->save();
}

段階的な説明が記載されている my tutorial を参照してください。

0
Liz Eipe C