Видаліть кілька продуктів у Magento


12

Чи є можливість видалити кілька продуктів, фільтруючи SKU? У мене є близько 1000 продуктів, які я хочу видалити.

Відповіді:


17

Найшвидший спосіб зробити це - запустити цей запит безпосередньо.

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

Все повинно красиво каскадувати. значення атрибутів буде видалено, відношення категорій буде видалено, розпродажів, перехресних продажів тощо і так далі.

[EDIT]
У цьому є улов. Завдяки STW за те, що помітили це. Огляди та рейтинги залишаться сиротами, оскільки немає стороннього ключа до таблиці продуктів для них.


5
не забудьте перевстановити після цього (якщо ви використовуєте плоский каталог товарів)
Володимир Керхофф

2
Це в основному те, що робить інструмент імпорту / експорту адміністратора, коли він використовує його для виконання масових видалень. Це надзвичайно швидко порівняно з дзвінками, ->delete()але ухилятиметься від прослуховування коду для подій. На складі Magento виявляється, що огляди та рейтинги будуть осиротілими (вони не будуть видалені, коли їх асоційований продукт).
STW

@STW. Гарний улов. Я повністю забув про відгуки та оцінки.
Маріус

Я не впевнений, це гарна ідея чи ні. Як щодо даних атрибутів, збережених у таблицях eav? видаляються і ті?
Анураг Патбандха

@AnuragPatbandha. всі catalog_product_entity_*таблиці мають ФК на entity_idполі до catalog_product_entity.entity_idполя. Вони повинні красиво каскадувати.
Маріус

15

З усією повагою ставитеся до Маріуса, але, будь ласка, не взаємодійте з базою даних безпосередньо, якщо її взагалі можна уникнути. Можливо, пов’язані таблиці будуть оновлені автоматично, якщо ваш випуск Magento та всі ваші розширення не будуть виправлені у всіх потрібних місцях. Але якщо їх немає, такі речі можуть зруйнувати ваш сайт.

Натомість ви можете використовувати власну функцію імпорту CSV Magento.

Просто перерахуйте свої SKU-файли у файлі, простому як:

sku
ABC1
ABC2
ABC3

... тощо. Потім збережіть як файл CSV.

Потім у системі> Імпорт / експорт> Імпорт виберіть Тип об'єкта: Продукти та поведінка імпорту: Видаліть об'єкти та імпортуйте цей файл. І це все!


2
fyi - загалом я згоден, що найкраще уникати прямої взаємодії з БД; однак саме так Magento видаляє продукти за допомогою інструмента імпорту адміністратора (див. Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW

припустимо, якщо я хочу видалити продукти з обраного магазину, який у мене формат CSV
zus

Якщо ви просто хочете скасувати призначення товарів у вибраному магазині, але не видалити їх із бази даних, ви можете спробувати імпорт CSV з двома стовпцями: sku та store, переконайтеся, що стовпець магазину містить лише ті ідентифікатори магазину, яким ви хочете, щоб продукт був призначений , виберіть Імпорт поведінки: оновіть та імпортуйте це. Я цього ще не перевіряв, тому дійте обережно! (Якщо знайду час, я перевіряю це пізніше і додам ще один коментар)
Дуг Маклін

6

Ви можете це робити програмно. Створіть skustodelete.csv з переліком усіх скасів, які потрібно видалити, після чого ось код, щоб продовжити далі

    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

Немає кодового способу

У розділі адміністратора внизу Manage Productsви знайдете сітку з усіма вашими продуктами. Існує стовпчик, який називається SKU. Тут ви можете фільтрувати свої продукти на основі вартості.

ску фільтр

Після того, як ви відфільтрували SKU, ви можете використовувати прапорці в лівій частині, щоб вибрати всі елементи, які потрібно видалити.

кратний вибір

Зауважте, select allщо буде виділено всі елементи в повній сітці та select visibleякі будуть вибирати лише елементи на поточній сторінці сітки.

Вибравши потрібні елементи, ви можете скористатися кнопкою масових дій у верхній правій частині сітки та вибрати варіант видалення.

видалити масові дії

Це підкаже вас, щоб переконатися, що ви хочете видалити ці елементи. Вибравши "да" для цього спливаючого вікна, ви перейдете до видалення елементів. Залежно від налаштувань вашого індексу, можливо, вам доведеться запустити повторний індекс після цього процесу.


2
І Select All працює з жахливою ефективністю. Випадково вибравши його без будь-яких обмежень пошуку, справді видаляється все у вашому каталозі товарів, а колись розпочато, вбивство сервера або втрата пам’яті під час видалення - це єдині речі, які зупиняють це.
Лабораторії Фіаско

3

Кевін S, ви можете видалити продукт за допомогою CSV-файлу. Просто дотримуйтесь кроку підкачки

Крок 1 :

Створіть файл csv і пройдіть скус, який потрібно видалити з системи. Дайте ім'я файлу як skus.csv

Крок 2:

Створіть та замініть файл php у вашому кореневому каталозі. Потім пройдіть наступний код

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

Примітка: я рекомендував вам перед запуском цього коду, ви повинні отримати резервну копію. Я сподіваюся, що це допоможе вам.


0

Тому що список таблиць

  • каталог_продукт_склад_варчар,
  • 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_product_link

є зовнішніми ключами каталогу_product_entity.

Тож коли ви видаляєте запис у catalog_product_entity, деякі записи з вищевказаних таблиць також будуть видалені.

Код (реалізуйте відповідь Маріуса) видаліть увесь продукт, у якого entityid <= 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.