Magento 2: Wie lösche ich alle Kategorien gleichzeitig?


9

Wir haben mit der Synchronisierung unserer vorhandenen Datenbank (nicht Magento) mit Magento 2 experimentiert.

Dabei haben wir über 1000 Kategorien erstellt, aber dann alle IDs neu angeordnet, um sie mit unserem System zu synchronisieren. Das Problem ist, dass ich die neuen Kategorien nicht mehr importieren kann, da die Fehlermeldung "URL-Schlüssel für den angegebenen Speicher ist bereits vorhanden" angezeigt wird. und wir bekommen jetzt doppelte Kategorien.

Ich denke, die beste Lösung wäre, sie alle auszuräumen und frisch zu importieren. Ich habe dieses Tutorial für 1.9 gefunden

https://gist.github.com/jklance/9664371

Wenn ich mir die neue Datenbank ansehe, bemerke ich kleine Unterschiede

  1. entity_type_id befindet sich in allen alten Kategorietabellen, aber in keiner der neuen.

  2. Die neue Datenbank verfügt über eine zusätzliche Tabelle catalog_category_product_index_tmp

Meine Fragen sind diese,

  1. kann ich diesen Code verwende ich gefunden und ändern entfernen entity_type_id und fügen TRUNCATE TABLE catalog_category_product_index_tmp;

  2. oder muss ich noch mehr ändern?

  3. oder können Sie mir ein sauberes Skript zur Verfügung stellen, um alle Kategorien zu entfernen?

Wir haben nur 1 Testprodukt im System, sodass Sie sich keine Sorgen machen müssen

Antworten:


19

Dieser arbeitete für mich in Magento ver. 2.1.0

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE TABLE catalog_category_entity;

TRUNCATE TABLE catalog_category_entity_datetime; 
TRUNCATE TABLE catalog_category_entity_decimal; 
TRUNCATE TABLE catalog_category_entity_int; 
TRUNCATE TABLE catalog_category_entity_text; 
TRUNCATE TABLE catalog_category_entity_varchar; 
TRUNCATE TABLE catalog_category_product; 
TRUNCATE TABLE catalog_category_product_index;

INSERT INTO `catalog_category_entity` (`entity_id`, `attribute_set_id`, `parent_id`, `created_at`, `updated_at`, `path`, `position`, `level`, `children_count`) VALUES ('1', '0', '0', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '1', '0', '0', '1'),
('2', '3', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '1/2', '1', '1', '0');

INSERT INTO `catalog_category_entity_int` (`value_id`, `attribute_id`, `store_id`, `entity_id`, `value`) VALUES 
('1', '69', '0', '1', '1'),
('2', '46', '0', '2', '1'),
('3', '69', '0', '2', '1');

INSERT INTO `catalog_category_entity_varchar` (`value_id`, `attribute_id`, `store_id`, `entity_id`, `value`) VALUES 
('1', '45', '0', '1', 'Root Catalog'),
('2', '45', '0', '2', 'Default Category');

SET FOREIGN_KEY_CHECKS = 1;

DELETE FROM url_rewrite WHERE entity_type = 'category';

Nur damit andere wissen, hat das perfekt für mich funktioniert. Die eine in der anderen Antwort hat bei mir nicht funktioniert, selbst nachdem die Tippfehler korrigiert wurden.
Hassan Al-Jeshi

Gibt Probleme beim anschließenden Erstellen von Produkten in Magento 2.2.3. Beim Erstellen des Produkts No such entity with id = 3
Condor

4

Dieser entfernt alle Kategorien in Magento EE 2.1

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE TABLE catalog_category_entity;

TRUNCATE TABLE catalog_category_entity_datetime; 
TRUNCATE TABLE catalog_category_entity_decimal; 
TRUNCATE TABLE catalog_category_entity_int; 
TRUNCATE TABLE catalog_category_entity_text; 
TRUNCATE TABLE catalog_category_entity_varchar; 
TRUNCATE TABLE catalog_category_product; 
TRUNCATE TABLE catalog_category_product_index;

INSERT INTO `catalog_category_entity` (`entity_id`, `created_in`, `updated_in`, `attribute_set_id`, `parent_id`, `created_at`, `updated_at`, `path`, `position`, `level`, `children_count`) VALUES 
('1', '1', '2', '0', '0', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '1', '0', '0', '1'),
('2', '1', '2', '3', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '1/2', '1', '1', '0');

INSERT INTO `catalog_category_entity_int` (`value_id`, `attribute_id`, `store_id`, `row_id`, `value`) VALUES 
('1', '69', '0', '1', '1'),
('2', '46', '0', '2', '1'),
('3', '69', '0', '2', '1');

INSERT INTO `catalog_category_entity_varchar` (`value_id`, `attribute_id`, `store_id`, `row_id`, `value`) VALUES 
('1', '45', '0', '1', 'Root Catalog'),
('2', '45', '0', '2', 'Default Category');

SET FOREIGN_KEY_CHECKS = 1;

DELETE FROM url_rewrite WHERE entity_type = 'category';
DELETE FROM `sequence_catalog_category` WHERE sequence_value > 2;

3

Im Folgenden werden alle Magento-Kategorien programmgesteuert mit Ausnahme der Stammkategorie gelöscht.

function deleteAllCategories($objectManager) {

$categoryFactory = $objectManager->get('Magento\Catalog\Model\CategoryFactory');
$newCategory = $categoryFactory->create();
$collection = $newCategory->getCollection();
$objectManager->get('Magento\Framework\Registry')->register('isSecureArea', true);

foreach($collection as $category) {

    $category_id = $category->getId();

    if( $category_id <= 2 ) continue;

    try {
        $category->delete();
        echo 'Category Removed '.$category_id .PHP_EOL;
    } catch (Exception $e) {
        echo 'Failed to remove category '.$category_id .PHP_EOL;
        echo $e->getMessage() . "\n" .PHP_EOL;
    }
}

}}

Bitte klicken Sie für eine detaillierte Erklärung. http://www.pearlbells.co.uk/mass-delete-magento-2-categories-programmatic/


Wird dadurch die Kategorie-ID nach dem Löschen zurückgesetzt?
Amit Singh

Nein, es wird nicht zurückgesetzt, es beginnt bei n + 1 (n ist die letzte Kategorie-ID in der vorherigen Version)
Liz Eipe C

3

(funktioniert mit Magento 2.2)

Wenn Trigger und Fremdschlüssel ordnungsgemäß funktionieren, was sollte der Fall sein, funktioniert dies folgendermaßen:

DELETE FROM `catalog_category_entity` WHERE `entity_id` >= 3;
ALTER TABLE `catalog_category_entity` AUTO_INCREMENT = 3;

1

Wichtige @ Liz-Antwort

public function deleteStoreCategories()
{
    $objectManager = Magento\Framework\App\ObjectManager::getInstance();
    $categoryFactory = $objectManager->get('Magento\Catalog\Model\CategoryFactory');
    $newCategory = $categoryFactory->create();
    $collection = $newCategory->getCollection();
    $objectManager->get('Magento\Framework\Registry')->register('isSecureArea', true);

    foreach ($collection as $category) {
        $category_id = $category->getId();

        if ($category_id <= 2) {
            continue;
        }

        try {
            $category->delete();
            echo 'Category Removed ' . $category_id . PHP_EOL;
        } catch (\Exception $e) {
            echo 'Failed to remove category ' . $category_id . PHP_EOL;
            echo $e->getMessage() . "\n" . PHP_EOL;
        }
    }
}

1

Ich habe dies kürzlich mit offensichtlichem Erfolg auf Magento 2.1 verwendet:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE `catalog_category_entity`; 
TRUNCATE TABLE `catalog_category_entity_datetime`; 
TRUNCATE TABLE `catalog_category_entity_decimal`; 
TRUNCATE TABLE `catalog_category_entity_int`; 
TRUNCATE TABLE `catalog_category_entity_text`; 
TRUNCATE TABLE `catalog_category_entity_varchar`; 
TRUNCATE TABLE `catalog_category_product`; 
TRUNCATE TABLE `catalog_category_product_index`;
INSERT INTO `catalog_category_entity`
    (`entity_id`,`created_at`,`updated_at`,`attribute_set_id`,`parent_id`,`path`,`POSITION`,`level`,`children_count`) 
    VALUES  (1,'2020-05-06 17:27:35','2020-05-06 17:27:35',0,0,'1',0,0,1),
            (2,'2020-05-06 17:27:35','2020-05-06 17:27:35',3,1,'1/2',1,1,0); 
INSERT INTO `catalog_category_entity_int`
    (`value_id`,`attribute_id`,`store_id`,`entity_id`,`value`) 
    VALUES  (1,69,0,1,1),
            (2,46,0,2,1),
            (3,69,0,2,1); 
INSERT INTO `catalog_category_entity_varchar`
    (`value_id`,`attribute_id`,`store_id`,`entity_id`,`value`)
    VALUES  (1,45,0,1,'Root Catalog'),
            (2,45,0,2,'Default Category'),
            (3,52,0,2,'PRODUCTS');
SET FOREIGN_KEY_CHECKS = 1;
DELETE FROM url_rewrite WHERE entity_type = 'category';

Die INSERTAnweisungen basieren auf dem Inhalt eines vollständig sauber installierten Magento 2.


0

Magento EE 2.2.6

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE TABLE catalog_category_entity;

TRUNCATE TABLE catalog_category_entity_datetime;

TRUNCATE TABLE catalog_category_entity_decimal; 

TRUNCATE TABLE catalog_category_entity_int; 

TRUNCATE TABLE catalog_category_entity_text; 

TRUNCATE TABLE catalog_category_entity_varchar; 

TRUNCATE TABLE catalog_category_product; 

TRUNCATE TABLE catalog_category_product_index;

TRUNCATE TABLE `sequence_catalog_category`;

TRUNCATE TABLE `visual_merchandiser_rule`;

INSERT INTO `catalog_category_entity` (`entity_id`, created_in, updated_in, `attribute_set_id`, `parent_id`, `created_at`, `updated_at`, `path`, `position`, `level`, `children_count`) 
VALUES ('1', '1', '2147483647', '0', '0', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '1', '0', '0', '1'),
('2', '1', '2147483647', '3', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, '1/2', '1', '1', '0');

INSERT INTO `catalog_category_entity_int` (`value_id`, `attribute_id`, `store_id`, `row_id`, `value`) VALUES 
('1', '70', '0', '1', '1'),
('2', '47', '0', '2', '1'),
('3', '70', '0', '2', '1');

INSERT INTO `catalog_category_entity_varchar` (`value_id`, `attribute_id`, `store_id`, `row_id`, `value`) VALUES 
('1', '46', '0', '1', 'Root Catalog'),
('2', '46', '0', '2', 'Default Category');

INSERT INTO `sequence_catalog_category`(`sequence_value`) VALUES 
('1'),
('2');

SET FOREIGN_KEY_CHECKS = 1;

DELETE FROM url_rewrite WHERE entity_type = 'category';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.