Ordnen Sie Produkte programmgesteuert in magento2 der Kategorie zu

9

Wie kann ich in Magento 2 programmgesteuert 'Neue Produkte' der Kategorie 'NEUE PRODUKTE' zuordnen?

Chinchu
quelle

Antworten:

17

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

Ronak Chauhan
quelle
Ich habe diesen Code in einem Block verwendet und versucht, diesen Block in einer Vorlagendatei zu rendern. Als ich diese Methode ausprobierte, wurde in der Vorlagendatei "Nicht erfasster Fehler: Aufruf einer Mitgliedsfunktion assignProductToCategories ()" angezeigt. Könnten Sie mir bitte helfen, das zu klären?
Chinchu
Haben Sie eine Abhängigkeit für "Magento \ Catalog \ Api \ CategoryLinkManagementInterface" angegeben ?
Ronak Chauhan
Ja, ich habe hinzugefügt. Ich habe gut gearbeitet.
Chinchu
Hallo @RonakChauhan, ich habe deinen Code ausprobiert, aber es scheint nicht zu funktionieren. Meine Produkte werden nicht der Kategorie zugeordnet.
Daniel_12
@ Daniel_12 bekommst du einen Fehler?
Ronak Chauhan
12

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.

T. Dreiling
quelle
Hallo, @ Drelling, konnte das Produkt "41859" nicht speichern, wobei Position 0 bis Kategorie 8 über dem Fehler lag.
jafar pinjar
Hallo @jafarpinjar, ist das alles, was Sie in Bezug auf Fehlermeldungen erhalten haben? Ich könnte mir einige Gründe vorstellen, warum dies passiert ist: 1. Sie haben versehentlich $ product-> getId () anstelle von $ product-> getSku () verwendet. 2. Der URL-Schlüssel des Produkts ist nicht eindeutig (obwohl ich denke, dass die Fehlermeldung wäre spezifisch) 3. Das Produkt ist bereits der Kategorie mit der ID 8
T. Dreiling
1. Können wir nicht $ product-> getId () verwenden? 3. Das Produkt ist bereits einer Kategorie mit der ID 8 - T zugeordnet. Wenn es zugewiesen ist, können wir es nicht entfernen?
Jafar Pinjar
1. Nein, assignProductToCategories () benötigt explizit die SKU, nicht die ID! Wenn dies Ihr Fehler war, versuchen Sie es stattdessen erneut mit der SKU. 3. Ah, ich habe mich hier etwas geirrt. Der Fehler, an den ich gedacht habe, tritt auf, wenn $ categoryIds dieselbe Kategorie mehr als einmal enthalten würde. Sie müssen tatsächlich die Kategorie-ID 8 angeben, um sie in dieser Kategorie zu behalten. Wenn Sie dies nicht tun, wird es entfernt. So können Sie ein Produkt aus einer Kategorie entfernen.
T. Dreiling
Der Fehler, an den ich gedacht habe, tritt auf, wenn $ categoryIds dieselbe Kategorie mehr als einmal enthalten würde. Es ist nicht möglich, oder? Da die Kategorie-ID eindeutig ist, übergebe ich sku nur an diese Methode. assignProductToCategories nicht die ID
jafar pinjar
5

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);
Chirag Dodia
quelle
Erhalten dieses Fehlers, konnte Produkt mit Position 0 zu Kategorie 8 nicht speichern
jafar pinjar
@jafarpinjar Dieser Fehler hängt mit anderen Anpassungen zusammen. Wenn Sie dieses Code-Snippet mit einer neuen Magento-Installation überprüfen, funktioniert es gut. Bitte überprüfen Sie, ob Anpassungen durch Dritte die Ausführung dieses Codes verhindern
chirag dodia
hi @chirag dodia, nein, ich habe diesen Code in einer benutzerdefinierten Datei verwendet und ihn ausgeführt, indem ich in den Stammordner verschoben habe. Es wird keine Anpassung verwendet
jafar pinjar
@jafarpinjar versuchen Sie es mit einem frischen Produkt und prüfen Sie, ob dies etwas mit einem bestimmten Produkt zu tun hat.
Chirag Dodia
Hallo @chirag, ich habe diesen Fehler erhalten, konnte das Produkt "41859" mit Position 0 nicht in Kategorie 8
speichern
0

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\CategoryFactoryeine 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!

SantiBM
quelle
-1
$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();
Yamen Ashraf
quelle
Dies ist eine sehr schwere Anfrage und wird im
Gegensatz