Löschen Sie mehrere Produkte in Magento


12

Gibt es eine Möglichkeit, mehrere Produkte durch Filtern mit der Artikelnummer zu löschen? Ich habe ungefähr 1000 Produkte, die ich löschen möchte.

Antworten:


17

Am schnellsten können Sie diese Abfrage direkt ausführen.

DELETE FROM `catalog_product_entity` WHERE `sku` IN ('SKU1', 'SKU2', ...., 'SKU1000');

Alles sollte schön kaskadieren. Attributwerte werden gelöscht, Kategoriebeziehungen werden gelöscht, Upsells, Crosssells und ähnliches und so weiter.

[EDIT] Das
hat einen Haken. Vielen Dank an STW, dass sie das entdeckt haben. Die Bewertungen und Bewertungen bleiben verwaist, da für sie kein Fremdschlüssel in der Produkttabelle vorhanden ist.


5
Vergessen Sie nicht, danach neu zu indizieren (wenn Sie einen flachen Produktkatalog verwenden)
Vladimir Kerkhoff

2
Dies ist im Grunde das, was das Admin-Import / Export-Tool macht, wenn es verwendet wird, um Massenlöschungen durchzuführen. Es ist extrem schnell im Vergleich zu Aufrufen ->delete(), weicht jedoch jedem Code aus, der auf Ereignisse wartet. Auf Lager Magento scheint es, dass Bewertungen und Bewertungen verwaist sind (sie werden nicht gelöscht, wenn das zugehörige Produkt ist).
STW

@STW. Schöner Fang. Ich habe die Kritiken und Bewertungen komplett vergessen.
Marius

Ich bin mir nicht sicher, ob es eine gute Idee ist oder nicht. Was ist mit Attributdaten, die in EAV-Tabellen gespeichert sind? werden diese auch gelöscht?
Anurag Patbandha

@AnuragPatbandha. Alle catalog_product_entity_*Tische haben einen FK auf dem entity_idFeld zum catalog_product_entity.entity_idFeld. Sie sollten schön kaskadieren.
Marius

14

Alles aus Respekt vor Marius, aber bitte interagiere nicht direkt mit der Datenbank, wenn es überhaupt vermeidbar ist. Vielleicht werden die verknüpften Tabellen automatisch aktualisiert werden, wenn Ihre Version von Magento und alle Erweiterungen fehlerfrei in den richtigen Stellen sind. Wenn dies nicht der Fall ist, kann so etwas Ihre Website zerstören.

Stattdessen können Sie die CSV-Importfunktion von Magento verwenden.

Listen Sie einfach Ihre SKUs in einer Datei auf, einfach als:

sku
ABC1
ABC2
ABC3

...etc. Dann als CSV-Datei speichern.

Wählen Sie dann unter System> Importieren / Exportieren> Importieren die Option Entitätstyp: Produkte und Importverhalten: Entitäten löschen und importieren Sie diese Datei. Und das ist es!


2
Allgemein stimme ich zu, dass es am besten ist, eine direkte DB-Interaktion zu vermeiden. Allerdings löscht Magento auf diese Weise Produkte über das Admin-Import-Tool (siehe Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW

Angenommen, ich möchte Produkte aus dem ausgewählten Geschäft löschen. Wie lautet mein CSV-Format?
Zusätzliche

Wenn Sie nur die Zuordnung von Produkten zu einem ausgewählten Geschäft aufheben möchten, diese jedoch nicht aus der Datenbank entfernen möchten, können Sie einen CSV-Import mit zwei Spalten versuchen: SKU und Geschäft. Stellen Sie sicher, dass die Geschäftsspalte nur die Geschäfts-IDs enthält, denen Sie das Produkt zuweisen möchten Wählen Sie Importverhalten: Aktualisieren aus, und importieren Sie das. Ich habe dies jedoch noch nicht getestet, seien Sie also vorsichtig! (Wenn ich Zeit finde, werde ich dies später testen und einen weiteren Kommentar hinzufügen)
Doug McLean

6

Sie können es programmgesteuert ausführen. Erstellen Sie eine skustodelete.csv-Datei, in der alle zu löschenden Skus aufgelistet sind. Danach folgt der Code, um fortzufahren

    require_once 'app/Mage.php';
    Mage :: app("default")->setCurrentStore(Mage_Core_Model_App :: ADMIN_STORE_ID);
    $skuAll = array();
    $file_handle = fopen("skustodelete.csv", "r");
    $catalog = Mage::getModel('catalog/product');
   while (!feof($file_handle)) {
     $line_of_text = fgetcsv($file_handle, 1024);
     $allSku = $line_of_text[0];
     $product = $catalog->loadByAttribute('sku', $allSku);
     try {
          $product->delete();
          echo "Product with ID: " . $product->getId() . " Deleted Successfully". PHP_EOL;
     } catch (Exception $e) {
          echo "Product with ID: " . $product->getId() . "cannot be deleted" . PHP_EOL;
     }
}
echo "Finish Delete";

3

Der Weg ohne Code

Im Admin-Bereich unter Manage Productsfinden Sie ein Raster mit all Ihren Produkten. Es gibt eine Spalte namens SKU. Hier können Sie Ihre Produkte nach dem Wert filtern.

SKU-Filter

Nachdem Sie nach Artikelnummer gefiltert haben, können Sie über die Kontrollkästchen auf der linken Seite alle Elemente auswählen, die Sie löschen möchten.

Mehrfachauswahl

Beachten Sie das, select alldas alle Elemente im vollständigen Raster und auswähltselect visible nur Elemente auf der aktuellen Seite des Rasters ausgewählt werden.

Nachdem Sie die gewünschten Elemente ausgewählt haben, können Sie die Massenaktionsschaltfläche oben rechts im Raster verwenden und die Löschoption auswählen.

Massenaktion löschen

Dadurch werden Sie aufgefordert, sicherzustellen, dass Sie diese Elemente wirklich löschen möchten. Nachdem Sie dieses Popup mit Ja bestätigt haben, werden Ihre Elemente gelöscht. Abhängig von Ihren Indexeinstellungen müssen Sie nach diesem Vorgang möglicherweise eine erneute Indexierung durchführen.


2
Und Select All arbeitet mit erschreckender Effizienz. Wenn Sie es versehentlich ohne Sucheinschränkungen auswählen, wird wirklich alles in Ihrem Produktkatalog gelöscht. Sobald Sie es gestartet haben, können Sie den Server beenden oder während des Löschvorgangs nicht mehr genügend Arbeitsspeicher zur Verfügung haben.
Fiasko Labs

3

Kevin S, können Sie Produkt von CSV-Datei löschen. Folgen Sie einfach dem Wogenschritt

Schritt 1 :

Erstellen Sie eine CSV-Datei und fügen Sie den Skus hinzu, den Sie aus dem System löschen möchten. Geben Sie den Dateinamen als skus.csv an

Schritt 2 :

Erstellen und ersetzen Sie eine PHP-Datei in Ihrem Stammverzeichnis. Dann über den folgenden Code hinaus

require_once '../app/Mage.php';
Mage :: app("default") -> setCurrentStore( Mage_Core_Model_App :: ADMIN_STORE_ID );
$skuAll =array();
$file_handle = fopen("skus.csv", "r");
 while (!feof($file_handle) ) {
    $line_of_text = fgetcsv($file_handle, 1024);
$allSku = $line_of_text[0];

}
$products = Mage::getResourceModel('catalog/product_collection')
    ->addAttributeToSelect('*') 
    ->addAttributeToFilter(
        'sku', array('in' => $allSku)
    )
    ->load();

    if(is_array($products))
    {
        foreach ($products as $key => $pId)
        {
            try
            {
                $product = Mage::getModel('catalog/product')->load($pId)->delete();
                echo "successfully deleted product with ID: ". $pId ."<br />";
            } 
            catch (Exception $e) 
            {
                echo "Could not delete product with ID: ". $pId ."<br />";
            }
        }
    }

Hinweis: Ich habe Ihnen empfohlen, vor dem Ausführen dieses Codes die Sicherungskopie zu erstellen. Ich hoffe es wird dir helfen.


0

Weil Tabellen auflisten

  • catalog_product_entity_varchar,
  • catalog_product_entity_tier_price,
  • catalog_product_entity_media_gallery,
  • catalog_product_entity_media_gallery_value,
  • catalog_product_entity_text,
  • catalog_product_entity_group_price,
  • catalog_product_entity_datetime,
  • catalog_product_entity_decimal,
  • catalog_product_entity_int
  • catalog_category_product
  • catalog_product_link

sind Fremdschlüssel von catalog_product_entity.

Wenn Sie also einen Datensatz in catalog_product_entity löschen, werden auch einige Datensätze der obigen Tabellen gelöscht.

Code (implementiere Marius 'Antwort) lösche alle Produkte mit entity_id <= 18069:

$adapter = $setup->getConnection("catalog_write");

$where = array(
    'entity_id <= ?' => '18069'
);

$tableCatalogProduct = Mage::getModel("catalog/product")->getResource()->getEntityTable();
$adapter->delete($tableCatalogProduct, $where);


$tableRating = Mage::getModel("rating/rating")->getResource()->getMainTable();
$adapter->delete($tableRating,  $where);

$tableRating = Mage::getModel("review/review")->getResource()->getMainTable();
$adapter->delete($tableRating, $where);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.