it-swarm.com.de

Programmgesteuert Hinzufügen von Magento-Produkten zu Kategorien

Ich verwende Magento 1.4.0.1 . Ich habe über 21000 einfache Produkte, die jeweils in einer einzigen Kategorie ..__ aufgeführt sind. Es gibt Hunderte von Kategorien auf meiner Website . Einige Produkte gehören in mehrere Kategorien . Gibt es eine Möglichkeit für mich, Produkte programmatisch in mehrere Kategorien einzufügen?

17
robgt

In PHP -Code können Sie sie während des Imports in die Kategorie einfügen.

Angenommen, Sie haben ein Produkt namens $ product und eine Kategorie-ID namens $ category_id

Sie können die Kategorien festlegen, zu denen ein Produkt gehört, indem Sie Folgendes tun

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

Wenn das Produkt bereits über Kategorien verfügt und Sie eine weitere hinzufügen möchten, können Sie getCategoryIds() folgendermaßen verwenden:

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

Oder, wie es von Joshua Peck in den Kommentaren erwähnt wurde, können Sie das Modell category_api verwenden, um ein Produkt aus einer Kategorie hinzuzufügen oder daraus zu entfernen, ohne die aktuellen Kategoriebestimmungen zu beeinflussen:

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

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

Ich möchte nur hinzufügen, dass Sie mit getSingleton Kategorie API entfernen und hinzufügen können:

Produkt aus der Kategorie entfernen:

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

Produkt zur Kategorie hinzufügen:

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

Dadurch werden keine Kategorien überschrieben, in denen sich das Produkt bereits befindet

18
Joshua Pack

Sie können ein Modul schreiben (was Zeit benötigt, aber möglicherweise schneller beim Importieren Ihrer Daten ist) oder Sie können etwas mit der API zusammenstellen (weniger Magento-Programmierung, beim Importieren der Daten jedoch möglicherweise langsamer).

Ihr Ausgangspunkt für das, was Sie bereits wissen, wie wertvoll Ihre Zeit ist und wie oft Sie das Update ausführen müssen, sollte Ihre Entscheidung bestimmen.

Hier ist die Magento API-Dokumentation zum Hinzufügen von Produkten zu Kategorien (siehe Beispiel unten auf der Seite):

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

2
ʍǝɥʇɐɯ

Nach einem Blick in die Magento-API: Magento fügt Produkte auf folgende Weise zu Kategorien hinzu:

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;
}

Und alle Produkte erhalten:

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

Die besten obigen Antwortpunkte für die Verwendung von Mage::getSingleton('catalog/category_api') ->assignProduct($category->getId(),$p‌​roduct->getId());

Trotzdem ist diese Funktion ziemlich langsam, falls Sie viele Produkte/Kategorien aktualisieren müssen. 

Dies liegt daran, dass die API-Funktion assignProduct()

  • akzeptieren Sie nur 1 Produkt/Kategorie zur Zeit 
  • bei jedem Anruf werden das Produkt und die Kategorie geladen und die Kategorie gespeichert
    (sehr langsam, falls Sie dieselbe Kategorie mehrmals aktualisieren müssen)

Angenommen, Sie möchten 10 Produkte einer Kategorie zuordnen. Sie wird dieselbe Kategorie 10 Mal laden und speichern.
(und laden Sie alle Produkte, die nicht wirklich benötigt werden, wenn Sie sicher sind, dass Ihre Produkt-IDs korrekt sind.)

Ein schneller Weg
Ich habe die folgende Funktion entwickelt, die der API entspricht, aber sie lädt und speichert nur die Kategorie einmal .

Diese Funktion akzeptiert ein Array als Parameter $data, der alle Änderungen in der Form von $category_id => array(all the products you want to assign) enthalten muss.

Es ist trivial, es an Ihre Bedürfnisse anzupassen, indem Sie beispielsweise einen Parameter für store_id (die Funktion verwenden standardmäßig 0) und Positionsinformationen zu den Produkten hinzufügen.

Kategorie hinzufügen

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();
    }
}

Kategorie entfernen

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();
    }
}

Hinweis

Beim Speichern der Kategorie werden der Category Flat Data und Catalog URL Rewrites reindex ausgelöst (wenn sie als update on save eingestellt sind).
Dies ist nicht ganz schnell (der API-Aufruf macht dasselbe) ...
... Sie können diese Neuindizes daher so einstellen, dass sie vor dem Ausführen der Änderungen manuell aktualisiert werden, und danach eine vollständige Neuindizierung durchführen
(abhängig von der Anzahl der Kategorien/Produkte, die Sie aktualisieren, kann dies die beste Option sein) 

1
WonderLand

Nun, ich habe das aus irgendeinem Grund aus Faulheit mit der API gemacht. Dadurch werden alle sichtbaren Produkte in die Kategorie mit der ID 146 aufgenommen:

<?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
ʍǝɥʇɐɯ

Wir können der Kategorie mehrere Produkte mit Magento-Skripts programmgesteuert zuweisen. Erstellen Sie ein Array der Kategorien und wählen Sie die Produkte basierend auf dem benutzerdefinierten Attribut oder Feld aus.

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

Durchlaufen Sie die Produkte und ordnen Sie sie der Kategorie zu.

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

Bitte beziehen Sie sich auf mein Tutorial das eine schrittweise Erklärung gibt.

0
Liz Eipe C