回答:
データを設定するには、カテゴリIDと製品IDを取得する必要があります。これを暗示する:
$this->getCategoryLinkManagement()->assignProductToCategories(
$product->getSku(),
$product->getCategoryIds()
);
この機能も実装します:
private function getCategoryLinkManagement()
{
if (null === $this->categoryLinkManagement) {
$this->categoryLinkManagement = \Magento\Framework\App\ObjectManager::getInstance()
->get('Magento\Catalog\Api\CategoryLinkManagementInterface');
}
return $this->categoryLinkManagement;
}
管理する必要がある残りの依存関係: Magento\Catalog\Api\CategoryLinkManagementInterface
初期化:
protected $categoryLinkManagement;
\ Magento \ Framework \ App \ ObjectManager :: getInstance()の直接使用はmagentoごとに有効ではないため、コンストラクターに挿入できます
この回答はmagento 2.2バージョン以下を対象としているため、メモしてください
私は、これにはオブジェクトマネージャを利用しない更新された回答が必要だと思います。また、どこにも言及されていないいくつかのねじれが関与しています。
コンストラクターで、CategoryLinkManagementInterfaceを挿入します。
protected $categoryLinkManagement;
public function __construct(
...
\Magento\Catalog\Api\CategoryLinkManagementInterface $categoryLinkManagementInterface,
...
) {
$this->categoryLinkManagement = $categoryLinkManagementInterface;
...
}
コードの後半で、次の方法でカテゴリを割り当てます。
$product = $this->productRepository->getById(1337); // or any other way to get a product model/interface
$categoryIds = [
42,
606
];
$this->categoryLinkManagement->assignProductToCategories(
$product->getSku(),
$categoryIds
);
これにより、以前のすべてのカテゴリ割り当てが置き換えられます。既存のカテゴリ割り当てを保持したい場合は、次のようなものを使用します。
$categoryIds = array_unique(
array_merge(
$product->getCategoryIds(),
$categoryIds
)
);
注意:リンク管理は、スケジュールされたインデクサーへの(製品属性の)カテゴリー割り当てを延期します。これは、商品に他の変更を加え、assignProductToCategories()の後で保存した場合
$product = $this->productRepository->save($product);
$ productにnull(新しく作成された製品の場合)または以前にその属性に割り当てられたカテゴリのみが含まれているため、カテゴリの割り当ては失われます。また、
$product = $this->productRepository->getById($product->getId());
assignProductToCategories()の直後は、上記と同じ理由で役に立ちません。可能な限り最新の時点でカテゴリーを割り当てるか(後で製品を保存しない場合)、または再度保存する前に手動で属性を割り当てます。
$product->setCategoryIds($categoryIds);
後者を使用することを選択した場合、おそらくsetCategoryIds()の使用のみにフォールバックできます。私はどちらのケース(assignProductToCategories + setCategoryIds + saveまたはsetCategoryIds only + save)のパフォーマンスへの影響もテストしていないため、コメントすることはできませんが、全体的な状況について言及することが重要だと思います。
製品をカテゴリに割り当て
<?php
$new_category_id = array('100','101');
$sku = 'sku of product';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$CategoryLinkRepository = $objectManager->get('\Magento\Catalog\Api\CategoryLinkManagementInterface');
$CategoryLinkRepository->assignProductToCategories($sku, $new_category_id);
カテゴリーから製品を削除
<?php
$category_id = 101;
$sku = 'sku of product';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$CategoryLinkRepository = $objectManager->get('\Magento\Catalog\Model\CategoryLinkRepository');
$CategoryLinkRepository->deleteByIds($category_id ,$sku);
質問の回答がすでにあったとしても、反復$this->getCategoryLinkManagement()->assignProductToCategories()
が非常に遅いため、製品のグループをカテゴリに割り当てるより速い方法を追加したいと思います。
この代替方法では、製品のグループを割り当てるカテゴリをロードする必要があるためMagento\Catalog\Model\CategoryFactory
、を挿入する必要がsetPostedProducts()
あります。の配列を使用するカテゴリに製品のグループを設定できる['entity_id','position']
ため、コード例は次のようになります。
use Magento\Catalog\Model\CategoryFactory;
...
protected $_category;
...
$this->_category = $categoryFactory;
$parentsCollection = $this->_productCollection->create()
->addFieldToSelect('entity_id')
->addFieldToFilter('entity_id',['in' => $data['parent_ids']]);
$parentsPosted = array_fill_keys(array_keys($parentsCollection->toArray(['entity_id'])), 0);
if($catIds == 80 || $catIds == 82) {
$category = $this->_category->create()->load($catIds);
$category->setPostedProducts($parentsPosted);
$category->save();
echo "Products assigned to category: ".$catIds."\n";
}
これが誰かを助けることを願っています!
$objectManager = ObjectManager::getInstance();
$catalogProduct = $objectManager->create('Magento\Catalog\Model\Product');
$catalogProduct->setSku('sku-1');
$catalogProduct->setName('name');
$catalogProduct->setAttributeSetId(4);
$catalogProduct->setStatus(1); // Status on product enabled/ disabled 1/0
$catalogProduct->setVisibility(4);
$catalogProduct->setTypeId('simple'); // type of product (simple/virtual/downloadable/configurable)
$catalogProduct->setPrice(100);
$catalogProduct->setCategoryIds(['id']); // here you are
$catalogProduct->setStockData([
'is_in_stock' => true,
'qty' => 10
]);
$catalogProduct->setStoreId(1); // $this->storeManagerInterface->getStore()->getId()
$catalogProduct->setWebsiteIds([1]); // $this->storeManagerInterface->getStore()->getWebsiteId()
$catalogProduct->save();