Magentoで複数の製品を削除する


12

SKUでフィルタリングして複数の製品を削除する方法はありますか?削除したい製品が約1000個あります。

回答:


17

最速の方法は、このクエリを直接実行することです。

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

すべてがうまくカスケードされるはずです。属性値が削除され、カテゴリの関係が削除され、アップセル、クロスセル、関連などが行われます。

[編集]
これには問題があります。これを見つけてくれたSTWに感謝します。レビューと評価は、それらの製品テーブルに外部キーがないため、孤立したままになります。


5
この後、インデックスの再作成を忘れないでください(フラットな製品カタログを使用する場合)
ウラジミールケルホフ14年

2
これは、基本的に、Admin Import / Exportツールを使用して一括削除を実行する際に行うことです。呼び出しに比べて非常に高速です->delete()が、イベントをリッスンするコードを回避します。Magentoの在庫は、レビューと評価が孤立しているようです(関連製品が削除されても削除されません)。
STW

@STW。ナイスキャッチ。レビューと評価を完全に忘れました。
マリウス

良いアイデアかどうかはわかりません。eavテーブルに保存された属性データはどうですか?それらも削除されますか?
アヌラグパトバンダ

@anuragPatbandha。すべてのcatalog_product_entity_*テーブルには、entity_idフィールドからフィールドへのFK がありcatalog_product_entity.entity_idます。彼らはうまくカスケードする必要があります。
マリウス

14

Mariusに敬意を表しますが、回避できない場合はデータベースと直接対話しないでください。たぶん、 Magentoの、すべてのあなたの拡張機能のご使用のリリースはバグのない正しい場所全てである場合、関連するテーブルは、自動的に更新されます。しかし、そうでないと、そのようなことがサイトを破壊する可能性があります。

代わりに、Magento独自のCSVインポート機能を使用できます。

次のように、ファイルにSKUをリストするだけです。

sku
ABC1
ABC2
ABC3

...等。次に、CSVファイルとして保存します。

次に、[システム]> [インポート/エクスポート]> [インポート]で、[エンティティタイプ:製品]および[インポート動作:エンティティの削除]を選択し、このファイルをインポートします。以上です!


2
fyi-一般に、直接的なDB対話を避けることが最善であることに同意します。しかし、これは(参照Magentoのは、管理者のインポートツールを使用して製品を削除する方法実際にあるMage_ImportExport_Model_Import_Entity_Product::_deleteProducts()
STW

選択したストアから製品を削除する場合、CSV形式は何ですか。
ZUS

選択したストアから製品の割り当てを解除するだけで、データベースから削除しない場合は、skuとstoreの2つの列を使用してCSVインポートを試行できます。ストア列には、製品を割り当てるストアIDのみが含まれていることを確認してください、[動作のインポート:更新]を選択してインポートします。私はこれをテストしていませんので、注意して進めてください!(私は後でこれをテストし、別のコメントを追加します時間見つけた場合)
ダグ・マクリーン

6

プログラムで実行できます。削除するすべてのskusをリストした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 14年

3

Kevin S、csvファイルで製品を削除できます。大波の手順に従ってください

ステップ1 :

csvファイルを作成し、システムから削除するskusを過ぎます。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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.