Usuń wiele produktów w Magento

12

Czy istnieje sposób na usunięcie wielu produktów poprzez filtrowanie za pomocą SKU? Mam około 1000 produktów, które chcę usunąć.

Kevin S.
źródło

Odpowiedzi:

17

Najszybszym sposobem na to jest bezpośrednie uruchomienie tego zapytania.

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

Wszystko powinno ładnie się kaskadować. wartości atrybutów zostaną usunięte, relacje kategorii zostaną usunięte, upsells, crosssells i powiązane i tak dalej.

[EDYCJA]
Jest w tym pewien haczyk. Dzięki STW za zauważenie tego. Recenzje i oceny pozostaną sierotami, ponieważ nie ma dla nich klucza obcego do tabeli produktów.

Marius
źródło
5
nie zapomnij o ponownym indeksowaniu po tym (jeśli korzystasz z katalogu produktów płaskich)
Vladimir Kerkhoff
2
Jest to w zasadzie to, co robi narzędzie importu / eksportu administratora, gdy używa go do masowego usuwania. Jest niezwykle szybki w porównaniu do wywoływania, ->delete()ale uniknie kodu wykrywającego zdarzenia. Na magazynie Magento wydaje się, że recenzje i oceny zostaną osierocone (nie zostaną usunięte, gdy powiązany jest z nimi produkt).
STW
@STW. Dobry chwyt. Zupełnie zapomniałem o recenzjach i ocenach.
Marius
Nie jestem pewien, czy to dobry pomysł, czy nie. Co z danymi atrybutów zapisanymi w tabelach eav? czy one też są usuwane?
Anurag Patbandha
@AnuragPatbandha. wszystkie catalog_product_entity_*tabele mają FK na entity_idpolu do catalog_product_entity.entity_idpola. Powinny ładnie kaskadować.
Marius
15

Z całym szacunkiem dla Mariusa, ale proszę nie wchodzić w bezpośrednią interakcję z bazą danych, jeśli można jej w ogóle uniknąć. Być może powiązane tabele zostaną zaktualizowane automatycznie, jeśli Twoja wersja Magento i wszystkie rozszerzenia są wolne od błędów we właściwych miejscach. Ale jeśli nie są, takie rzeczy mogą zniszczyć Twoją witrynę.

Zamiast tego możesz użyć funkcji importu CSV Magento.

Po prostu wypisz swoje SKU w pliku, tak proste jak:

sku
ABC1
ABC2
ABC3

...itp. Następnie zapisz jako plik CSV.

Następnie w System> Import / Export> Import wybierz Typ jednostki: Produkty i Zachowanie importu: Usuń jednostki i zaimportuj ten plik. I to wszystko!

Doug McLean
źródło
2
fyi - ogólnie zgadzam się, że najlepszym rozwiązaniem jest unikanie bezpośredniej interakcji z DB; jednak w ten sposób Magento usuwa produkty za pomocą narzędzia do importowania przez administratora (patrz Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW
załóżmy, że jeśli chcę usunąć produkty z wybranego sklepu, jaki jest mój format CSV.
zus
Jeśli chcesz tylko cofnąć przypisanie produktów z wybranego sklepu, ale nie usunąć ich z bazy danych, możesz wypróbować import CSV z dwiema kolumnami: sku i store, upewnij się, że kolumna sklepu zawiera tylko te identyfikatory sklepu, do których chcesz przypisać produkt , wybierz Zachowanie importu: zaktualizuj i zaimportuj to. Nie testowałem tego jednak, więc zachowaj ostrożność! (Jeśli znajdę czas, przetestuję to później i dodam kolejny komentarz)
Doug McLean,
6

Możesz to zrobić programowo. Utwórz skustodelete.csv z listą wszystkich skusów do usunięcia, a następnie oto kod, aby przejść dalej

    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";
Kumar A.
źródło
3

Brak kodu

W sekcji administracyjnej poniżej Manage Productsznajdziesz siatkę ze wszystkimi Twoimi produktami. Istnieje kolumna o nazwie SKU. Tutaj możesz filtrować swoje produkty według wartości.

filtr SKU

Następnie po przefiltrowaniu według SKU możesz użyć pól wyboru po lewej stronie, aby wybrać wszystkie elementy, które chcesz usunąć.

wielokrotny wybór

Zauważ, select allktóry wybierze wszystkie elementy w całej siatce, a select visiblektóry wybierze tylko elementy na bieżącej stronie siatki.

Po wybraniu elementów, które chcesz, możesz użyć przycisku akcji masowej w prawym górnym rogu siatki i wybrać opcję usuwania.

usuń akcję masową

Spowoduje to wyświetlenie monitu o upewnienie się, że chcesz usunąć te elementy. Po wybraniu opcji Tak dla tego wyskakującego okienka rozpocznie się usuwanie elementów. W zależności od ustawień indeksu po tym procesie może być konieczne ponowne zaindeksowanie.

David Manners
źródło
2
A Select All działa z przerażającą wydajnością. Przypadkowe wybranie go bez żadnych ograniczeń wyszukiwania naprawdę usuwa wszystko z katalogu produktów, a po uruchomieniu zabijanie serwera lub brak pamięci podczas usuwania to jedyne rzeczy, które go zatrzymują.
Fiasco Labs
3

Kevin S, możesz usunąć produkt według pliku csv. Postępuj zgodnie z krokiem kłębka

Krok 1 :

Utwórz plik csv i wklej skus, który chcesz usunąć z systemu. Podaj nazwę pliku jako skus.csv

Krok 2 :

Utwórz i zamień plik php w katalogu głównym. Następnie wklej następujący kod

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

Uwaga: przed uruchomieniem tego kodu zaleciłem Ci wykonanie kopii zapasowej. Mam nadzieję, że to ci pomoże.

Supravat Mondal
źródło
0

Ponieważ listy tabel

  • katalog_produktu_wektor_produktu,
  • cena_katalogu_produktu_produktu,
  • catalog_product_entity_media_gallery,
  • wartość_katalogu_produktu_media_media_galeria,
  • katalog_produktu_produktu_tekst,
  • cena_katalogu_produktu_grupa_produktu,
  • katalog_produktu_produktu_data,
  • katalog_produktu_decymalny,
  • katalog_produktu_intent_intity
  • katalog_kategoria_produkt
  • link_katalog_produktu

są kluczami obcymi katalogu_produktu_produktu.

Więc kiedy usuniesz rekord w katalogu katalog_produktu, niektóre rekordy powyższych tabel również zostaną usunięte.

Kod (zaimplementuj odpowiedź Mariusa) usuń wszystkie produkty, które mają identyfikator podmiotu <= 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);
Christian Nguyen
źródło