Excluir vários produtos no Magento

12

Existe alguma maneira de excluir vários produtos filtrando com o SKU? Tenho cerca de 1000 produtos que desejo excluir.

Kevin S
fonte

Respostas:

17

A maneira mais rápida de fazer isso é executar essa consulta diretamente.

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

Tudo deve cascata bem. os valores dos atributos serão excluídos, as relações de categoria serão excluídas, upsells, crosssells e afins.

[EDIT]
Há um problema nisso. Obrigado à STW por detectar isso. As revisões e classificações permanecerão órfãs porque não há chave estrangeira na tabela de produtos para elas.

Marius
fonte
5
Não se esqueça de reindexar depois deste (se você usar catálogo de produtos flat)
Vladimir Kerkhoff
2
Isso é basicamente o que a ferramenta Admin Import / Export faz ao usá-la para executar exclusões em massa. É extremamente rápido em comparação com as chamadas, ->delete()mas evita qualquer escuta de código de eventos. Em estoque, Magento, parece que as avaliações e classificações ficarão órfãs (elas não serão excluídas quando o produto associado for).
STW
@STW. Boa pegada. Eu esqueci completamente os comentários e classificações.
Marius
Não tenho certeza se é uma boa ideia ou não. E os dados dos atributos que foram salvos nas tabelas eav? esses também são excluídos?
Anurag Patbandha
@AnuragPatbandha. todas as catalog_product_entity_*tabelas têm um FK no entity_idcampo a catalog_product_entity.entity_idcampo. Eles devem cascatear bem.
Marius
14

Com o devido respeito ao Marius, mas não interaja diretamente com o banco de dados, se for evitável. Talvez as tabelas relacionadas sejam atualizadas automaticamente, se o seu lançamento do Magento e todas as suas extensões estiverem livres de bugs nos lugares certos. Mas, se não estiverem, esse tipo de coisa pode destruir seu site.

Em vez disso, você pode usar o próprio recurso de importação de CSV do Magento.

Basta listar seus SKUs em um arquivo, simples como:

sku
ABC1
ABC2
ABC3

... etc Em seguida, salve como um arquivo CSV.

Em Sistema> Importar / Exportar> Importar, selecione Tipo de Entidade: Produtos e Comportamento de Importação: Excluir Entidades e importe esse arquivo. E é isso!

Doug McLean
fonte
2
fyi - geralmente concordo que é melhor evitar a interação direta com o banco de dados; no entanto, é assim que o Magento exclui produtos através da ferramenta Admin Import (veja Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW /
suponha que, se eu quiser excluir produtos da loja selecionada, qual é o meu formato CSV.
Zus 21/12
Se você deseja apenas cancelar a atribuição de produtos de uma loja selecionada, mas não removê-los do banco de dados, tente uma importação de CSV com duas colunas: sku e store, verifique se a coluna da loja contém apenas os IDs de loja aos quais você deseja atribuir o produto , selecione Importar comportamento: atualize e importe isso. Eu não testei isso, então prossiga com cuidado! (Se eu encontrar tempo eu vou testar isso mais tarde e adicionar outro comentário)
Doug McLean
6

Você pode fazer isso programaticamente. Crie um skustodelete.csv listando todos os skus a serem excluídos e, depois disso, aqui está o código para prosseguir

    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.
fonte
3

A maneira sem código

Na seção de administração, Manage Productsencontrará uma grade com todos os seus produtos. Há uma coluna chamada SKU. Aqui você pode filtrar seus produtos com base no valor.

filtro sku

Depois de filtrar por SKU, você pode usar as caixas de seleção no lado esquerdo para selecionar todos os itens que deseja excluir.

seleção múltipla

Observe o select allque selecionará todos os itens na grade completa e o select visibleque selecionará apenas itens na página atual da grade.

Depois de selecionar os itens desejados, você pode usar o botão de ação em massa no lado superior direito da grade e selecionar a opção de exclusão.

excluir ação em massa

Isso solicitará que você tenha certeza de que deseja excluir esses itens. Após selecionar sim neste pop-up, ele excluirá seus itens. Dependendo das configurações do seu índice, pode ser necessário executar um re-índice após esse processo.

David Manners
fonte
2
E Select All funciona com uma eficiência aterradora. Escolhê-lo acidentalmente sem qualquer tipo de restrição de pesquisa realmente exclui tudo no catálogo de produtos e, uma vez iniciado, mata o servidor ou fica sem memória durante a exclusão, são as únicas coisas que o impedem.
Fiasco Labs
3

Kevin S, você pode excluir o produto por arquivo csv. Basta seguir a etapa da vaga

Passo 1 :

Crie um arquivo csv e passe os skus que deseja excluir do sistema. Dê o nome do arquivo como skus.csv

Passo 2 :

Crie e substitua um arquivo php em seu diretório raiz. Depois do código a seguir

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: Eu recomendei a você antes de executar este código, você deve obter o backup. Espero que seja de ajuda.

Supravat M
fonte
0

Porque tabelas de lista

  • 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

são chaves estrangeiras de catalog_product_entity.

Portanto, ao excluir um registro em catalog_product_entity, alguns registros das tabelas acima também serão excluídos.

O código (implemente a resposta de Marius) exclui todos os produtos que possuem 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);
christian Nguyen
fonte