Supprimer plusieurs produits dans Magento

12

Existe-t-il un moyen de supprimer plusieurs produits en filtrant avec SKU? J'ai environ 1000 produits à supprimer.

Kevin S
la source

Réponses:

17

La façon la plus rapide de le faire est d'exécuter cette requête directement.

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

Tout devrait bien jaillir. les valeurs d'attribut seront supprimées, les relations de catégorie seront supprimées, les ventes incitatives, les ventes croisées et connexes, etc.

[EDIT]
Il y a un hic à cela. Merci à STW d'avoir repéré cela. Les avis et notes resteront orphelins car il n'y a pas de clé étrangère dans le tableau des produits pour eux.

Marius
la source
5
n'oubliez pas de réindexer après cela (si vous utilisez un catalogue de produits plat)
Vladimir Kerkhoff
2
C'est essentiellement ce que l'outil Admin Import / Export fait lorsqu'il l'utilise pour effectuer des suppressions en masse. Il est extrêmement rapide par rapport à l'appel ->delete()mais esquivera tout code à l'écoute des événements. En stock Magento, il semble que les avis et les évaluations seront orphelins (ils ne seront pas supprimés lorsque leur produit associé le sera).
STW
@STW. Belle prise. J'ai complètement oublié les critiques et les notes.
Marius
Je ne sais pas si c'est une bonne idée ou non. Qu'en est-il des données d'attribut enregistrées dans les tables eav? sont-ils également supprimés?
Anurag Patbandha
@AnuragPatbandha. toutes les catalog_product_entity_*tables ont un FK sur le entity_idterrain sur le catalog_product_entity.entity_idterrain. Ils devraient bien cascade.
Marius
15

Tout le respect dû à Marius, mais s'il vous plaît n'interagissez pas directement avec la base de données si elle est évitable. Peut - être que les tableaux associés seront mis à jour automatiquement, si votre version de Magento et toutes vos extensions sont exemptes de bogues aux bons endroits. Mais s'ils ne le sont pas, ce genre de chose peut détruire votre site.

Au lieu de cela, vous pouvez utiliser la propre fonction d'importation CSV de Magento.

Listez simplement vos références dans un fichier, aussi simple que:

sku
ABC1
ABC2
ABC3

...etc. Enregistrez ensuite en tant que fichier CSV.

Ensuite, dans Système> Importer / Exporter> Importer, sélectionnez Type d'entité: produits et comportement d'importation: supprimer les entités et importez ce fichier. Et c'est tout!

Doug McLean
la source
2
fyi - en général, je suis d'accord qu'il vaut mieux éviter l'interaction directe avec les bases de données; cependant, c'est en fait de cette façon que Magento supprime les produits via l'outil Admin Import (voir Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW
Supposons que si je souhaite supprimer des produits du magasin sélectionné, quel est mon format CSV.
2017
Si vous souhaitez simplement désaffecter des produits d'un magasin sélectionné sans les supprimer de la base de données, vous pouvez essayer une importation CSV avec deux colonnes: sku et store, assurez-vous que la colonne du magasin ne contient que les ID de magasin auxquels vous souhaitez attribuer le produit. , sélectionnez Import Behavior: update et importez-le. Je n'ai pas testé cela cependant, alors soyez prudent! (Si je trouve du temps, je testerai cela plus tard et ajouterai un autre commentaire)
Doug McLean
6

Vous pouvez le faire par programme. Créez un skustodelete.csv répertoriant tous les skus à supprimer et après cela, voici le code pour continuer

    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.
la source
3

La méthode sans code

Dans la section d'administration sous Manage Productstrouverait une grille avec tous vos produits. Il y a une colonne appelée SKU. Ici, vous pouvez filtrer vos produits en fonction de la valeur.

filtre sku

Ensuite, une fois que vous avez filtré par SKU, vous pouvez utiliser les cases à cocher sur le côté gauche pour sélectionner tous les éléments que vous souhaitez supprimer.

sélection multiple

Remarquez select allqui sélectionnera tous les éléments de la grille complète et select visiblequi ne sélectionnera que les éléments de la page actuelle de la grille.

Une fois que vous avez sélectionné les éléments que vous souhaitez, vous pouvez utiliser le bouton d'action de masse en haut à droite de la grille et sélectionner l'option de suppression.

supprimer une action de masse

Cela vous invitera à vous assurer de vouloir supprimer ces éléments. Après avoir sélectionné oui à ce pop-up, il supprimera vos éléments. En fonction de vos paramètres d'index, vous devrez peut-être exécuter une réindexation après ce processus.

David Manners
la source
2
Et tout sélectionner fonctionne avec une efficacité terrifiante. Le choisir accidentellement sans aucune sorte de contraintes de recherche supprime vraiment tout dans votre catalogue de produits, et une fois démarré, tuer le serveur ou manquer de mémoire pendant la suppression sont les seules choses qui l'arrêtent.
Fiasco Labs
3

Kevin S, vous pouvez supprimer le produit par fichier csv. Suivez simplement l'étape

Étape 1 :

Créez un fichier csv et passez les skus que vous souhaitez supprimer du système. Donnez le nom de fichier sous skus.csv

Étape 2 :

Créez et remplacez un fichier php dans votre répertoire racine. Ensuite, passez le code suivant

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

Remarque: je vous ai recommandé avant d'exécuter ce code que vous devez obtenir la sauvegarde. J'espère que cela vous aidera.

Supravat M
la source
0

Parce que lister les tableaux

  • 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
  • lien_produit_catalogue

sont des clés étrangères de catalog_product_entity.

Ainsi, lorsque vous supprimez un enregistrement dans catalog_product_entity, certains enregistrements des tables ci-dessus seront également supprimés.

Code (implémentez la réponse de Marius) supprimez tous les produits qui ont 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
la source