Elimina più prodotti in Magento


12

Esiste un modo per eliminare più prodotti filtrando con SKU? Ho circa 1000 prodotti che voglio eliminare.

Risposte:


17

Il modo più veloce per farlo è eseguire direttamente questa query.

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

Tutto dovrebbe cascata bene. i valori degli attributi verranno eliminati, le relazioni di categoria verranno eliminate, i upsell, i crosssell e relativi e così via.

[EDIT]
C'è un problema in questo. Grazie a STW per averlo individuato. Le recensioni e le valutazioni rimarranno orfane perché non esiste una chiave esterna per la tabella dei prodotti.


5
non dimenticarti di reindicarti dopo questo (se usi un catalogo di prodotti flat)
Vladimir Kerkhoff,

2
Questo è fondamentalmente ciò che fa lo strumento di importazione / esportazione amministratore quando lo si utilizza per eseguire eliminazioni di massa. È estremamente veloce rispetto alla chiamata ->delete()ma eviterà qualsiasi codice in ascolto per eventi. Disponibile Magento sembra che le recensioni e le valutazioni siano orfane (non saranno cancellate quando il loro prodotto associato è).
STW

@STW. Bella presa. Ho completamente dimenticato le recensioni e le valutazioni.
Marius

Non sono sicuro che sia una buona idea o no. Che dire dei dati degli attributi salvati nelle tabelle eav? anche quelli vengono cancellati?
Anurag Patbandha,

@AnuragPatbandha. tutte le catalog_product_entity_*tabelle hanno un FK sul entity_idcampo verso il catalog_product_entity.entity_idcampo. Dovrebbero cascata bene.
Marius

15

Tutto il dovuto rispetto per Marius, ma per favore non interagire direttamente con il database se è assolutamente evitabile. Forse le tabelle correlate verranno aggiornate automaticamente, se la tua versione di Magento e tutte le tue estensioni sono prive di bug in tutti i posti giusti. Ma se non lo sono, questo genere di cose può distruggere il tuo sito.

Invece, puoi usare la funzione di importazione CSV di Magento.

Elenca i tuoi SKU in un file, semplice come:

sku
ABC1
ABC2
ABC3

...eccetera. Quindi salva come file CSV.

Quindi, in Sistema> Importa / Esporta> Importa, selezionare Tipo di entità: Prodotti e comportamento di importazione: Elimina entità e importare questo file. E questo è tutto!


2
a proposito: in genere concordo sul fatto che è meglio evitare l'interazione diretta con DB; tuttavia in questo modo Magento elimina i prodotti tramite lo strumento di importazione dell'amministratore (vedi Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW

supponiamo che se desidero eliminare i prodotti dal negozio selezionato, qual è il mio formato CSV.
zus

Se desideri solo annullare l'assegnazione di prodotti da un negozio selezionato ma non rimuoverli dal database, puoi provare un'importazione CSV con due colonne: sku e store, assicurati che la colonna del negozio contenga solo gli ID negozio a cui desideri assegnare il prodotto , seleziona Importa comportamento: aggiorna e importa quello. Non l'ho ancora provato, quindi procedi con cautela! (Se trovo il tempo lo proverò più tardi e aggiungerò un altro commento)
Doug McLean il

6

Puoi farlo a livello di codice. Crea un skustodelete.csv che elenca tutti gli skus da eliminare e successivamente ecco il codice per procedere ulteriormente

    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

Il modo del codice nessuno

Nella sezione admin sotto Manage Productstroverai una griglia con tutti i tuoi prodotti. C'è una colonna chiamata SKU. Qui puoi filtrare i tuoi prodotti in base al valore.

filtro sku

Quindi, una volta filtrato per SKU, è possibile utilizzare le caselle di controllo sul lato sinistro per selezionare tutti gli elementi che si desidera eliminare.

selezione multipla

Notare select allche selezionerà tutti gli elementi nella griglia completa e select visibleche selezionerà solo gli elementi nella pagina corrente della griglia.

Dopo aver selezionato gli elementi desiderati, puoi utilizzare il pulsante di azione di massa nella parte in alto a destra della griglia e selezionare l'opzione di eliminazione.

elimina l'azione di massa

Questo ti chiederà di assicurarti di voler eliminare questi elementi. Dopo aver selezionato Sì in questo pop-up, procederà all'eliminazione dei tuoi articoli. A seconda delle impostazioni dell'indice, potrebbe essere necessario eseguire un reindicizzazione dopo questo processo.


2
E Select All funziona con efficienza terrificante. La scelta accidentale senza alcun tipo di vincoli di ricerca elimina davvero tutto nel catalogo dei prodotti e, una volta avviato, l'uccisione del server o l'esaurimento della memoria durante l'eliminazione sono le uniche cose che lo fermano.
Fiasco Labs,

3

Kevin S, puoi eliminare il prodotto dal file csv. Segui semplicemente il passo fluttuante

Passo 1 :

Crea un file CSV e incolla gli skus che desideri eliminare dal sistema. Assegna il nome del file come skus.csv

Passo 2 :

Crea e sostituisci un file php nella tua directory principale. Quindi oltre il seguente codice

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

Nota: prima di eseguire questo codice, ti ho raccomandato di ottenere il backup. Spero che ti sarà di aiuto.


0

Perché elenca le tabelle

  • 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

sono chiavi esterne di catalog_product_entity.

Pertanto, quando si elimina un record in catalog_product_entity, verranno eliminati anche alcuni record delle tabelle precedenti.

Il codice (implementa la risposta di Marius) elimina tutti i prodotti che hanno 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.