Antworten:
Sie müssen Kategorie-IDs und Produkt-IDs abrufen, um Daten festzulegen: Implementieren Sie dies:
$this->getCategoryLinkManagement()->assignProductToCategories(
$product->getSku(),
$product->getCategoryIds()
);
Implementieren Sie auch diese Funktion:
private function getCategoryLinkManagement()
{
if (null === $this->categoryLinkManagement) {
$this->categoryLinkManagement = \Magento\Framework\App\ObjectManager::getInstance()
->get('Magento\Catalog\Api\CategoryLinkManagementInterface');
}
return $this->categoryLinkManagement;
}
Restabhängigkeit, die Sie verwalten sollten für: Magento\Catalog\Api\CategoryLinkManagementInterface
initialisieren:
protected $categoryLinkManagement;
Die direkte Verwendung von \ Magento \ Framework \ App \ ObjectManager :: getInstance () ist gemäß Magento nicht gültig, sodass Sie es in Constructor einfügen können
Diese Antwort gilt für Versionen unter Magento 2.2. Bitte beachten Sie dies
Ich denke, dies erfordert eine aktualisierte Antwort, die den Objektmanager nicht verwendet. Es gibt auch einige Knicke, die nirgendwo erwähnt werden.
Fügen Sie in Ihrem Konstruktor das CategoryLinkManagementInterface ein:
protected $categoryLinkManagement;
public function __construct(
...
\Magento\Catalog\Api\CategoryLinkManagementInterface $categoryLinkManagementInterface,
...
) {
$this->categoryLinkManagement = $categoryLinkManagementInterface;
...
}
Weisen Sie später in Ihrem Code die folgenden Kategorien zu:
$product = $this->productRepository->getById(1337); // or any other way to get a product model/interface
$categoryIds = [
42,
606
];
$this->categoryLinkManagement->assignProductToCategories(
$product->getSku(),
$categoryIds
);
Dies ersetzt alle vorherigen Kategoriezuweisungen. Wenn Sie die vorhandenen Kategoriezuweisungen beibehalten möchten, verwenden Sie Folgendes:
$categoryIds = array_unique(
array_merge(
$product->getCategoryIds(),
$categoryIds
)
);
Beachten Sie : Die Linkverwaltung verschiebt die Kategoriezuordnung (für das Produktattribut) zum geplanten Indexer. Dies bedeutet, wenn Sie andere Änderungen am Produkt vornehmen und es nach der Zuweisung von ProductToCategories () speichern.
$product = $this->productRepository->save($product);
Die Kategoriezuweisungen werden gelöscht, da $ product entweder null enthält (wenn es sich um ein neu erstelltes Produkt handelt) oder nur die zuvor zugewiesenen Kategorien für sein Attribut. Ebenfalls,
$product = $this->productRepository->getById($product->getId());
direkt nach assignProductToCategories () hilft aus dem oben genannten Grund nicht. Weisen Sie entweder Kategorien zum spätestmöglichen Zeitpunkt zu (wenn Sie das Produkt danach nicht speichern) oder weisen Sie das Attribut manuell zu, bevor Sie es erneut speichern
$product->setCategoryIds($categoryIds);
Wenn Sie sich für Letzteres entscheiden, können Sie wahrscheinlich nur auf setCategoryIds () zurückgreifen. Ich habe keinen der beiden Fälle (assignProductToCategories + setCategoryIds + save oder setCategoryIds + save) auf Auswirkungen auf die Leistung getestet, daher kann ich dies nicht kommentieren, aber ich denke, der gesamte Umstand war wichtig zu erwähnen.
Produkte der Kategorie zuordnen
<?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);
Produkte aus der Kategorie entfernen
<?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);
Selbst wenn die Frage bereits beantwortet wurde, möchte ich eine schnellere Möglichkeit hinzufügen, eine Produktgruppe einer Kategorie zuzuweisen, da die Iteration $this->getCategoryLinkManagement()->assignProductToCategories()
recht langsam ist
Diese Alternative beinhaltet das Laden der Kategorie, der unsere Produktgruppe zugewiesen werden soll. Wir müssen also Magento\Catalog\Model\CategoryFactory
eine Gruppe von Produkten auf die Kategorie setzen, setPostedProducts()
die ein Array von verwendet, ['entity_id','position']
sodass ein Codebeispiel ungefähr so aussehen würde:
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";
}
Hoffe das hilft jemandem!
$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();