Magento 1.4.0.1を使用しています。私は21000以上のシンプルな製品を持っていますが、それぞれが1つのカテゴリーに入りました。私のサイトには何百ものカテゴリがあります。一部の製品は複数のカテゴリに属しています。プログラムで製品を複数のカテゴリに追加する方法はありますか?
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(),$product->getId());
Mage::getSingleton('catalog/category_api')
->removeProduct($category->getId(),$product->getId());
_
GetSingletonカテゴリAPIで削除および追加できることを追加したいだけです。
カテゴリーから製品を削除するには:
Mage::getSingleton('catalog/category_api')->removeProduct($category->getId(),$product->getId());
製品をカテゴリに追加するには:
Mage::getSingleton('catalog/category_api')->assignProduct($category->getId(),$product->getId());
これにより、製品がすでに存在するカテゴリは上書きされません
モジュールを作成することもできます(時間がかかりますが、データのインポートは高速になる可能性があります)。APIを使用して何かを作成することもできます(Magentoプログラミングの関与は少なくなりますが、データのインポートが低速になる可能性があります)。
あなたが知っているもののあなたの出発点、あなたの時間はどれほど価値があるか、そしてどれくらいの頻度でアップデートを実行する必要があるかはあなたの選択を決定するでしょう。
以下は、カテゴリーに製品を追加するためのMagento APIのドキュメントです(ページ下部の例を参照)。
http://www.magentocommerce.com/wiki/doc/webservices-api/api/catalog_category
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;
}
上記の最良の答えは、Mage::getSingleton('catalog/category_api') ->assignProduct($category->getId(),$product->getId());
を使用することです
とにかく、更新する製品/カテゴリがたくさんある場合、その機能はかなり遅いです。
これは、API関数assignProduct()
が原因です。
たとえば、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呼び出しも同じです)...
...変更を実行する前に手動で更新するようにこれらの再インデックスを設定し、その後、それらに対して完全な再インデックスを実行することができます。
(更新するカテゴリ/製品の数によっては、これが最適なオプションになる可能性があります)
まあ私は怠惰のいくつかの理由のために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']));
}
?>
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 を参照してください。