Il y a beaucoup de messages concernant ce problème sur Magento. La plupart d'entre eux fonctionnent, mais le problème avec les catégories qui ne réinitialisent pas leurs valeurs à zéro après l'exécution des codes de suppression/instructions SQL persiste et n'est pas résolu jusqu'à présent.
Quelqu'un at-il le bon code ou la bonne procédure pour supprimer correctement tous les produits de l’inventaire et que la liste des catégories soit également remise à zéro après son exécution?
Merci d'avance.
Quelle que soit la méthode utilisée pour supprimer les produits, la reconstruction de l'index "Catégorie de produits" devrait corriger les comptes. Allez dans Système> Gestion des index. Cochez la case "Catégorie de produits", modifiez l'action (en haut à droite) en "Réindexer" et cliquez sur Soumettre.
Suppression de tous les produits de Magento peut être facilement réalisée, exécutez simplement:
DELETE FROM `catalog_product_entity`
En raison des contraintes de clé étrangère définies dans la base de données de Magento, toutes les autres tables contenant des informations sur le produit sont bien nettoyées. Bien sûr, il faudra un certain temps pour supprimer un grand nombre de produits, mais au moins, tout se nettoiera bien.
Si la requête ne peut pas être exécutée à cause du temps d'exécution maximal, vous pouvez toujours exécuter quelque chose comme:
DELETE FROM `catalog_product_entity` LIMIT 10000
Mise à jour: Cette logique est également utilisée dans le noyau de Magento, donc son utilisation est sûre! https://github.com/OpenMage/magento-mirror/blob/magento-1.8/app/code/core/Mage/ImportExport/Model/Import/Entity/Product.php#L462
Dans un script autonome:
<?php
require 'app/Mage.php';
Mage::app('admin')->setUseSessionInUrl(false);
$products = Mage::getModel('catalog/product')->getCollection();
foreach ($products as $product) {
try {
$product->delete();
} catch(Exception $e) {
echo "Product #".$product->getId()." could not be remvoved: ".$e->getMessage();
}
}
Est-ce que cela pour plus de 1400 produits, a bien fonctionné. Vous devez faire une réindexation après cela.
Attention, le script ci-dessus supprimera TOUT vos produits
Pour supprimer tous les produits, vous pouvez utiliser cette requête:
TRUNCATE TABLE `catalog_product_bundle_option`;
TRUNCATE TABLE `catalog_product_bundle_option_value`;
TRUNCATE TABLE `catalog_product_bundle_selection`;
TRUNCATE TABLE `catalog_product_entity_datetime`;
TRUNCATE TABLE `catalog_product_entity_decimal`;
TRUNCATE TABLE `catalog_product_entity_gallery`;
TRUNCATE TABLE `catalog_product_entity_int`;
TRUNCATE TABLE `catalog_product_entity_media_gallery`;
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`;
TRUNCATE TABLE `catalog_product_entity_text`;
TRUNCATE TABLE `catalog_product_entity_tier_price`;
TRUNCATE TABLE `catalog_product_entity_varchar`;
TRUNCATE TABLE `catalog_product_link`;
TRUNCATE TABLE `catalog_product_link_attribute`;
TRUNCATE TABLE `catalog_product_link_attribute_decimal`;
TRUNCATE TABLE `catalog_product_link_attribute_int`;
TRUNCATE TABLE `catalog_product_link_attribute_varchar`;
TRUNCATE TABLE `catalog_product_link_type`;
TRUNCATE TABLE `catalog_product_option`;
TRUNCATE TABLE `catalog_product_option_price`;
TRUNCATE TABLE `catalog_product_option_title`;
TRUNCATE TABLE `catalog_product_option_type_price`;
TRUNCATE TABLE `catalog_product_option_type_title`;
TRUNCATE TABLE `catalog_product_option_type_value`;
TRUNCATE TABLE `catalog_product_super_attribute`;
TRUNCATE TABLE `catalog_product_super_attribute_label`;
TRUNCATE TABLE `catalog_product_super_attribute_pricing`;
TRUNCATE TABLE `catalog_product_super_link`;
TRUNCATE TABLE `catalog_product_enabled_index`;
TRUNCATE TABLE `catalog_product_website`;
TRUNCATE TABLE `catalog_product_entity`;
TRUNCATE TABLE `cataloginventory_stock`;
TRUNCATE TABLE `cataloginventory_stock_item`;
TRUNCATE TABLE `cataloginventory_stock_status`;
INSERT INTO `catalog_product_link_type`(`link_type_id`,`code`) VALUES (1,'relation'),(2,'bundle'),(3,'super'),(4,'up_sell'),(5,'cross_sell');
INSERT INTO `catalog_product_link_attribute`(`product_link_attribute_id`,`link_type_id`,`product_link_attribute_code`,`data_type`) VALUES (1,2,'qty','decimal'),(2,1,'position','int'),(3,4,'position','int'),(4,5,'position','int'),(6,1,'qty','decimal'),(7,3,'position','int'),(8,3,'qty','decimal');
INSERT INTO `cataloginventory_stock`(`stock_id`,`stock_name`) VALUES (1,'Default');
Cordialement :)
Pour supprimer des produits, vous pouvez simplement utiliser le backend:
Catalogue> Gérer les produits> Sélectionnez toutes les boîtes aux lettres et choisissez Action = Supprimer et appuyez sur Soumettre.
Cela peut fonctionner très bien pour des milliers de produits.
Mage::getModel('catalog/product')->getCollection()->delete();
Testé sur Magento 1.7.0.2
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE `catalog_product_bundle_option`;
TRUNCATE TABLE `catalog_product_bundle_option_value`;
TRUNCATE TABLE `catalog_product_bundle_selection`;
TRUNCATE TABLE `catalog_product_entity_datetime`;
TRUNCATE TABLE `catalog_product_entity_decimal`;
TRUNCATE TABLE `catalog_product_entity_gallery`;
TRUNCATE TABLE `catalog_product_entity_int`;
TRUNCATE TABLE `catalog_product_entity_media_gallery`;
TRUNCATE TABLE `catalog_product_entity_media_gallery_value`;
TRUNCATE TABLE `catalog_product_entity_text`;
TRUNCATE TABLE `catalog_product_entity_tier_price`;
TRUNCATE TABLE `catalog_product_entity_varchar`;
TRUNCATE TABLE `catalog_product_flat_1`;
TRUNCATE TABLE `catalog_product_link`;
TRUNCATE TABLE `catalog_product_link_attribute`;
TRUNCATE TABLE `catalog_product_link_attribute_decimal`;
TRUNCATE TABLE `catalog_product_link_attribute_int`;
TRUNCATE TABLE `catalog_product_link_attribute_varchar`;
TRUNCATE TABLE `catalog_product_link_type`;
TRUNCATE TABLE `catalog_product_option`;
TRUNCATE TABLE `catalog_product_option_price`;
TRUNCATE TABLE `catalog_product_option_title`;
TRUNCATE TABLE `catalog_product_option_type_price`;
TRUNCATE TABLE `catalog_product_option_type_title`;
TRUNCATE TABLE `catalog_product_option_type_value`;
TRUNCATE TABLE `catalog_product_super_attribute_label`;
TRUNCATE TABLE `catalog_product_super_attribute_pricing`;
TRUNCATE TABLE `catalog_product_super_attribute`;
TRUNCATE TABLE `catalog_product_super_link`;
TRUNCATE TABLE `catalog_product_enabled_index`;
TRUNCATE TABLE `catalog_product_website`;
TRUNCATE TABLE `catalog_product_relation`;
TRUNCATE TABLE `catalog_category_product_index`;
TRUNCATE TABLE `catalog_category_product`;
TRUNCATE TABLE `cataloginventory_stock_item`;
TRUNCATE TABLE `cataloginventory_stock_status`;
TRUNCATE TABLE `cataloginventory_stock_status_idx`;
TRUNCATE TABLE `cataloginventory_stock`;
TRUNCATE TABLE `core_url_rewrite`;
INSERT INTO `catalog_product_link_type`(`link_type_id`,`code`) VALUES (1,'relation'),(2,'bundle'),(3,'super'),(4,'up_sell'),(5,'cross_sell');
INSERT INTO `catalog_product_link_attribute`(`product_link_attribute_id`,`link_type_id`,`product_link_attribute_code`,`data_type`) VALUES (1,2,'qty','decimal'),(2,1,'position','int'),(3,4,'position','int'),(4,5,'position','int'),(6,1,'qty','decimal'),(7,3,'position','int'),(8,3,'qty','decimal');
INSERT INTO `cataloginventory_stock`(`stock_id`,`stock_name`) VALUES (1,'Default');
TRUNCATE TABLE `catalog_product_entity`;
SET FOREIGN_KEY_CHECKS = 1;
Travaillé comme un charme ...
Php phpmyadmin - sélectionnez la base de données (magento) SWL en haut puis collez le texte suivant:
DELETE FROM `catalog_product_entity`
La solution la plus propre à mon avis est la suivante:
System -> Index Management
et réglez tous les index sur le mode d'index "Mise à jour manuelle".Catalog -> Manage Products
, sélectionnez tous les produits et utilisez l'action Delete
pour supprimer tous les produits.Ce n'est pas aussi rapide que de supprimer manuellement les produits de la base de données, mais c'est probablement le moyen le plus rapide de supprimer tous les produits pour lesquels vous n'avez pas à vous soucier des entrées de base de données orphelines ou des conflits de clés étrangères.