Xóa nhiều sản phẩm trong Magento


12

Có cách nào để xóa nhiều sản phẩm bằng cách lọc bằng SKU không? Tôi có khoảng 1000 sản phẩm mà tôi muốn xóa.

Câu trả lời:


17

Cách nhanh nhất để làm điều đó là chạy truy vấn này trực tiếp.

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

Mọi thứ nên xếp tầng độc đáo. giá trị thuộc tính sẽ bị xóa, quan hệ thể loại sẽ bị xóa, upells, crosssells và liên quan và như vậy.

[EDIT]
Có một nhược điểm này. Cảm ơn STW đã phát hiện ra điều này. Các đánh giá và xếp hạng sẽ vẫn là trẻ mồ côi vì không có khóa ngoại đối với bảng sản phẩm dành cho chúng.


5
đừng quên reindex sau này (nếu bạn sử dụng danh mục sản phẩm phẳng)
Vladimir Kerkhoff

2
Về cơ bản, đây là những gì công cụ Nhập / Xuất của Quản trị viên thực hiện khi sử dụng nó để thực hiện xóa hàng loạt. Nó cực kỳ nhanh so với gọi ->delete()nhưng sẽ né bất kỳ mã nào nghe các sự kiện. Trong kho Magento, có vẻ như các đánh giá và xếp hạng sẽ bị mồ côi (chúng sẽ không bị xóa khi sản phẩm được liên kết của chúng).
STW

@STW. Bắt đẹp. Tôi hoàn toàn quên mất các đánh giá và xếp hạng.
Marius

Tôi không chắc liệu đó có phải là ý tưởng tốt hay không. Điều gì về dữ liệu thuộc tính được lưu trong bảng eav? những cái đó cũng bị xóa à?
Anurag Patbandha

@AnuragPatbandha. tất cả các catalog_product_entity_*bảng có FK trên entity_idtrường đến catalog_product_entity.entity_idtrường. Họ nên xếp tầng độc đáo.
Marius

14

Tất cả đều tôn trọng Marius, nhưng vui lòng không tương tác trực tiếp với cơ sở dữ liệu nếu điều đó hoàn toàn có thể tránh được. Có thể các bảng liên quan sẽ được cập nhật tự động, nếu bản phát hành Magento của bạn và tất cả các tiện ích mở rộng của bạn không có lỗi ở tất cả các vị trí thích hợp. Nhưng nếu họ không, loại điều đó có thể phá hủy trang web của bạn.

Thay vào đó, bạn có thể sử dụng tính năng nhập CSV của riêng Magento.

Chỉ cần liệt kê SKU của bạn trong một tệp, đơn giản như:

sku
ABC1
ABC2
ABC3

...Vân vân. Sau đó lưu dưới dạng tệp CSV.

Sau đó, trong Hệ thống> Nhập / Xuất> Nhập, chọn Loại thực thể: Sản phẩm và Hành vi nhập: Xóa Thực thể và nhập tệp này. Và đó là nó!


2
fyi - nói chung tôi đồng ý rằng tránh tương tác DB trực tiếp là tốt nhất; tuy nhiên đây thực sự là cách Magento xóa sản phẩm thông qua công cụ Nhập quản trị viên (xem Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW

giả sử nếu tôi muốn xóa sản phẩm khỏi cửa hàng đã chọn, định dạng CSV của tôi là gì.
zus

Nếu bạn chỉ muốn hủy gán sản phẩm từ một cửa hàng đã chọn nhưng không xóa chúng khỏi cơ sở dữ liệu, bạn có thể thử nhập CSV với hai cột: sku và lưu trữ, đảm bảo cột cửa hàng chỉ chứa các ID cửa hàng mà bạn muốn sản phẩm được gán cho , chọn Nhập hành vi: cập nhật và nhập đó. Tôi đã không kiểm tra điều này mặc dù, vì vậy tiến hành thận trọng! (Nếu tôi tìm thấy thời gian, tôi sẽ kiểm tra điều này sau và thêm một nhận xét khác)
Doug McLean

6

Bạn có thể làm điều đó theo chương trình. Tạo một skustodelete.csv liệt kê tất cả các skus sẽ bị xóa và sau đó đây là mã để tiếp tục

    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

Cách không có mã

Trong phần quản trị dưới đây Manage Productssẽ tìm thấy một lưới với tất cả các sản phẩm của bạn. Có một cột gọi là SKU. Tại đây bạn có thể lọc các sản phẩm của mình dựa trên giá trị.

bộ lọc sku

Sau đó, khi bạn đã lọc bởi SKU, bạn có thể sử dụng các hộp kiểm ở phía bên trái để chọn tất cả các mục bạn muốn xóa.

nhiều lựa chọn

Lưu ý cái select allnào sẽ chọn tất cả các mục trong lưới hoàn chỉnh và select visiblesẽ chỉ chọn các mục trên trang hiện tại của lưới.

Khi bạn đã chọn các mục bạn muốn, bạn có thể sử dụng nút hành động hàng loạt ở phía trên bên phải của lưới và chọn tùy chọn xóa.

xóa hành động hàng loạt

Điều này sẽ nhắc bạn đảm bảo rằng bạn chắc chắn muốn xóa các mục này. Sau khi chọn có cho cửa sổ bật lên này, nó sẽ tiến hành xóa các mục của bạn. Tùy thuộc vào cài đặt chỉ mục của bạn, bạn có thể phải chạy lại chỉ mục sau quá trình này.


2
chọn tất cả các công trình với hiệu quả đáng sợ. Vô tình chọn nó mà không có bất kỳ ràng buộc tìm kiếm nào thực sự xóa mọi thứ trong danh mục sản phẩm của bạn và sau khi bắt đầu, giết chết máy chủ hoặc hết bộ nhớ trong khi xóa là những điều duy nhất ngăn chặn nó.
Phòng thí nghiệm Fiasco

3

Kevin S, bạn có thể xóa sản phẩm bằng tệp csv. Chỉ cần làm theo bước cuồn cuộn

Bước 1 :

Tạo một tệp csv và qua skus mà bạn muốn xóa khỏi hệ thống. Đặt tên tệp là skus.csv

Bước 2 :

Tạo và thay thế một tập tin php trong thư mục gốc của bạn. Sau đó qua đoạn mã sau

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

Lưu ý: Tôi đã khuyến nghị bạn trước khi chạy mã này, bạn phải có bản sao lưu. Tôi hy vọng nó sẽ giúp bạn.


0

Vì bảng danh sách

  • catalog_product_entity_varchar,
  • catalog_product_entity_tier_price,
  • catalog_product_entity_media_gallery,
  • catalog_product_entity_media_gallery_value,
  • catalog_product_entity bản,
  • catalog_product_entity_group_price,
  • catalog_product_entity_datetime,
  • catalog_product_entity_decimal,
  • catalog_product_entity_int
  • catalog_carget_product
  • catalog_product_link

là các khóa ngoại của catalog_product_entity.

Vì vậy, khi xóa một bản ghi trong catalog_product_entity, một số bản ghi của các bảng trên cũng sẽ bị xóa.

(thực hiện câu trả lời của Marius) xóa tất cả sản phẩm có 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.