Hapus beberapa produk di Magento

12

Apakah ada cara untuk menghapus banyak produk dengan memfilter dengan SKU? Saya memiliki sekitar 1000 produk yang ingin saya hapus.

Kevin S
sumber

Jawaban:

17

Cara tercepat untuk melakukannya adalah dengan menjalankan kueri ini secara langsung.

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

Semuanya harus mengalir dengan baik. nilai atribut akan dihapus, relasi kategori akan dihapus, upsells, crosssell dan terkait dan seterusnya.

[EDIT]
Ada kaitannya dengan ini. Terima kasih kepada STW untuk mengetahui hal ini. Ulasan dan peringkat akan tetap yatim karena tidak ada kunci asing ke tabel produk untuk mereka.

Marius
sumber
5
jangan lupa untuk mengindeks ulang setelah ini (jika Anda menggunakan katalog produk flat)
Vladimir Kerkhoff
2
Ini pada dasarnya adalah apa yang dilakukan alat Impor / Ekspor Admin saat menggunakannya untuk melakukan penghapusan massal. Ini sangat cepat dibandingkan dengan menelepon ->delete()tetapi akan menghindari kode mendengarkan acara. Dalam persediaan Magento, tampaknya ulasan dan peringkat akan menjadi yatim (mereka tidak akan dihapus saat produk terkaitnya).
STW
@STW. Tangkapan bagus. Saya benar-benar lupa tentang ulasan dan peringkat.
Marius
Saya tidak yakin apakah itu ide yang bagus atau tidak. Bagaimana dengan data atribut yang disimpan dalam tabel eav? apakah itu dihapus juga?
Anurag Patbandha
@AnuragPatbandha. semua catalog_product_entity_*tabel memiliki FK di entity_idlapangan ke catalog_product_entity.entity_idlapangan. Mereka harus mengalir dengan baik.
Marius
15

Semua hormat kepada Marius, tapi tolong jangan berinteraksi dengan database secara langsung jika itu bisa dihindari. Mungkin tabel terkait akan diperbarui secara otomatis, jika rilis Magento dan semua ekstensi Anda bebas bug di semua tempat yang tepat. Tetapi jika tidak, hal semacam itu dapat menghancurkan situs Anda.

Sebagai gantinya, Anda dapat menggunakan fitur impor CSV Magento sendiri.

Cukup daftarkan SKU Anda dalam file, sesederhana:

sku
ABC1
ABC2
ABC3

... dll. Kemudian simpan sebagai file CSV.

Kemudian, di Sistem> Impor / Ekspor> Impor, pilih Jenis Entitas: Produk dan Perilaku Impor: Hapus Entitas, dan impor file ini. Dan itu dia!

Doug McLean
sumber
2
fyi - umumnya saya setuju bahwa menghindari interaksi DB langsung adalah yang terbaik; namun ini sebenarnya cara Magento menghapus produk melalui alat Impor Admin (lihat Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW
misalkan jika saya ingin menghapus produk dari toko yang dipilih, apa format CSV saya.
zus
Jika Anda hanya ingin membatalkan penetapan produk dari toko yang dipilih tetapi tidak menghapusnya dari database, Anda dapat mencoba impor CSV dengan dua kolom: sku dan toko, pastikan kolom toko hanya berisi ID toko yang Anda inginkan untuk produk yang ditugaskan produk tersebut , pilih Impor Perilaku: perbarui, dan impor itu. Saya belum menguji ini, jadi lanjutkan dengan hati-hati! (Jika saya menemukan waktu, saya akan menguji ini nanti dan menambahkan komentar lain)
Doug McLean
6

Anda dapat melakukannya secara terprogram. Buat skustodelete.csv daftar semua skus untuk dihapus dan setelah itu di sini adalah kode untuk melanjutkan

    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.
sumber
3

Cara tidak ada kode

Di bagian admin di bawah Manage Productsakan ditemukan kotak dengan semua produk Anda. Ada kolom yang disebut SKU. Di sini Anda dapat memfilter produk Anda berdasarkan nilainya.

filter sku

Kemudian setelah Anda memfilter berdasarkan SKU Anda dapat menggunakan kotak centang di sebelah kiri untuk memilih semua item yang ingin Anda hapus.

pilih banyak

Perhatikan select allitem mana yang akan memilih semua item dalam kisi lengkap dan select visibleyang hanya akan memilih item pada halaman kisi saat ini.

Setelah memilih item yang diinginkan, Anda dapat menggunakan tombol aksi massal di sisi kanan atas kisi dan pilih opsi hapus.

hapus aksi massal

Ini akan meminta Anda untuk memastikan Anda yakin ingin menghapus item-item ini. Setelah memilih ya untuk pop-up ini akan melanjutkan untuk menghapus item Anda. Bergantung pada pengaturan indeks Anda, Anda mungkin harus menjalankan indeks ulang setelah proses ini.

David Manners
sumber
2
Dan Select All berfungsi dengan efisiensi yang mengerikan. Memilih secara tidak sengaja tanpa kendala pencarian apa pun benar-benar menghapus semua yang ada di katalog produk Anda, dan begitu mulai, membunuh server atau kehabisan memori selama penghapusan adalah satu-satunya hal yang menghentikannya.
Fiasco Labs
3

Kevin S, Anda dapat menghapus produk dengan file csv. Cukup ikuti langkah mengepul

Langkah 1 :

Buat file csv dan lewati skus yang ingin Anda hapus dari sistem. Beri nama file sebagai skus.csv

Langkah 2 :

Buat & ganti file php di direktori root Anda. Lalu, lewati kode berikut

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

Catatan: Saya merekomendasikan kepada Anda sebelum menjalankan kode ini Anda harus mendapatkan cadangan. Saya harap ini akan membantu Anda.

Supravat M
sumber
0

Karena daftar tabel

  • 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

adalah kunci asing dari catalog_product_entity.

Jadi ketika menghapus catatan di catalog_product_entity, beberapa catatan dari tabel di atas juga akan dihapus.

Kode (menerapkan jawaban Marius) hapus semua produk yang memiliki entitas_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
sumber