Удалить несколько продуктов в Magento

12

Есть ли способ удалить несколько товаров, отфильтровав их по SKU? У меня есть около 1000 продуктов, которые я хочу удалить.

Кевин С
источник

Ответы:

17

Самый быстрый способ сделать это - выполнить этот запрос напрямую.

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

Все должно красиво каскадироваться. Значения атрибутов будут удалены, отношения категорий будут удалены, продажи, перекрестные продажи и связанные с ними и так далее.

[РЕДАКТИРОВАТЬ]
Есть ловушка для этого. Спасибо STW за это. Отзывы и рейтинги останутся сиротами, поскольку для них нет внешнего ключа к таблице продуктов.

Мариус
источник
5
не забудьте переиндексировать после этого (если вы используете плоский каталог продукции)
Владимир Керхофф
2
Это в основном то, что делает инструмент Admin Import / Export при использовании его для массового удаления. Это чрезвычайно быстро по сравнению с вызовом, ->delete()но уклоняется от любого прослушивания кода для событий. В наличии Magento кажется, что обзоры и рейтинги будут осиротевшими (они не будут удалены, когда их связанный продукт).
STW
@STW. Хорошо поймал. Я полностью забыл об отзывах и рейтингах.
Мариус
Я не уверен, хорошая это идея или нет. А как насчет данных атрибутов, которые сохраняются в таблицах eav? те тоже удалены?
Анураг Патбандха
@AnuragPatbandha. все catalog_product_entity_*таблицы имеют FK на entity_idполе к catalog_product_entity.entity_idполю. Они должны красиво каскадироваться.
Мариус
15

При всем уважении к Мариусу, но, пожалуйста, не взаимодействуйте напрямую с базой данных, если ее вообще можно избежать. Возможно, соответствующие таблицы будут обновлены автоматически, если ваш релиз Magento и все ваши расширения не содержат ошибок во всех нужных местах. Но если это не так, то подобные вещи могут разрушить ваш сайт.

Вместо этого вы можете использовать собственную функцию импорта CSV в Magento.

Просто перечислите свои SKU в файле, например:

sku
ABC1
ABC2
ABC3

...и т.д. Затем сохраните как файл CSV.

Затем в Системе> Импорт / Экспорт> Импорт выберите Тип объекта: Продукты и Поведение при импорте: Удалить объекты и импортируйте этот файл. Вот и все!

Даг Маклин
источник
2
fyi - как правило, я согласен, что лучше избегать прямого взаимодействия с БД; однако именно так Magento удаляет продукты с помощью инструмента Admin Import (см. Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW
предположим, если я хочу удалить товары из выбранного магазина, какой у меня формат CSV.
Zus
Если вы просто хотите отменить назначение товаров из выбранного магазина, но не удалить их из базы данных, вы можете попробовать импортировать CSV с двумя столбцами: sku и store, убедитесь, что столбец 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

Затем, после того как вы отфильтровали по SKU, вы можете использовать флажки слева, чтобы выбрать все элементы, которые вы хотите удалить.

множественный выбор

Обратите внимание на тот, select allкоторый будет выбирать все элементы в полной сетке и select visibleкоторый будет выбирать только элементы на текущей странице сетки.

После того, как вы выбрали нужные элементы, вы можете использовать кнопку массового действия в верхней правой части сетки и выбрать опцию удаления.

удалить массовое действие

Это предложит вам убедиться, что вы хотите удалить эти элементы. После выбора «Да» в этом всплывающем окне он продолжит удаление ваших элементов. В зависимости от настроек индекса вам может потребоваться выполнить переиндексацию после этого процесса.

Дэвид Мэннерс
источник
2
И Select All работает с потрясающей эффективностью. Случайный выбор без каких-либо ограничений поиска действительно удаляет все в вашем каталоге продуктов, и после запуска, единственное, что его останавливает, это убить сервер или нехватка памяти во время удаления.
Fiasco Labs
3

Кевин С. Вы можете удалить продукт по 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_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

являются внешними ключами catalog_product_entity.

Таким образом, при удалении записи в catalog_product_entity некоторые записи из вышеуказанных таблиц также будут удалены.

Код (реализовать ответ Мариуса) удалить все продукты, которые имеют 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);
Кристиан Нгуен
источник