마 젠토에서 여러 제품 삭제


12

SKU로 필터링하여 여러 제품을 삭제하는 방법이 있습니까? 삭제하려는 약 1000 개의 제품이 있습니다.

답변:


17

가장 빠른 방법은이 쿼리를 직접 실행하는 것입니다.

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

모든 것이 멋지게 캐스케이드되어야합니다. 속성 값이 삭제되고 카테고리 관계가 삭제되고 업셀, 크로스 셀 등이 관련됩니다.

[편집]
이것에 대한 캐치가 있습니다. 이것을 발견 한 STW에게 감사합니다. 제품 표에 대한 외래 키가 없기 때문에 리뷰와 등급은 고아로 유지됩니다.


5
(당신은 평면 제품 카탈로그를 사용하는 경우) 그나마이 후 인덱싱하는 것을 잊지
블라디미르 Kerkhoff에게

2
이것은 기본적으로 Admin Import / Export 도구를 사용하여 대량 삭제를 수행 할 때 수행하는 작업입니다. 호출에 비해 매우 빠르지 ->delete()만 이벤트를 수신하는 모든 코드를 피합니다. 재고 있음 Magento는 리뷰와 평가가 분리 된 것으로 보입니다 (관련된 제품이있을 때 삭제되지 않음).
STW

@STW. 잘 잡았다. 나는 리뷰와 평가에 대해 완전히 잊었다.
Marius

좋은 생각인지 확실하지 않습니다. eav 테이블에 저장된 속성 데이터는 어떻습니까? 그것들도 삭제 되었습니까?
Anurag Patbandha

아리따움 모든 catalog_product_entity_*테이블에는 entity_id필드 의 필드에 FK 가 catalog_product_entity.entity_id있습니다. 그들은 캐스케이드해야합니다.
Marius

15

Marius를 존중하지만 데이터베이스를 피할 수 있다면 데이터베이스와 직접 상호 작용하지 마십시오. 어쩌면 젠토와 모든 확장 당신의 릴리스는 버그가없는 적절한 장소 모두있는 경우 관련 테이블이 자동으로 업데이트됩니다. 그러나 그렇지 않은 경우 이러한 종류의 사이트가 사이트를 손상시킬 수 있습니다.

대신 Magento의 자체 CSV 가져 오기 기능을 사용할 수 있습니다.

SKU를 파일에 다음과 같이 간단하게 나열하십시오.

sku
ABC1
ABC2
ABC3

...기타. 그런 다음 CSV 파일로 저장하십시오.

그런 다음 시스템> 가져 오기 / 내보내기> 가져 오기에서 엔티티 유형 : 제품 및 가져 오기 동작 : 엔티티 삭제를 선택하고이 파일을 가져 오십시오. 그리고 그게 다야!


2
참고-일반적으로 직접적인 DB 상호 작용을 피하는 것이 가장 좋습니다. 그러나이 젠토는 관리자 가져 오기 도구를 통해 제품을 삭제하는 방법을 실제로 (참조 Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW

선택한 상점에서 제품을 삭제하려는 경우 CSV 형식은 무엇입니까?
zus

선택한 상점에서 제품을 지정 해제하고 데이터베이스에서 제거하지 않으려면 sku 및 store라는 두 개의 열로 CSV 가져 오기를 시도 할 수 있습니다. 상점 열에 제품을 지정하려는 상점 ID 만 포함되어 있는지 확인하십시오. 가져 오기 동작 : 업데이트를 선택하고 가져옵니다. 나는 이것을 테스트하지 않았으므로주의해서 진행하십시오! (시간을 찾으면 나중에 테스트하고 다른 의견을 추가하겠습니다.)
Doug McLean

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

none code way

아래의 관리 섹션에서 Manage Products모든 제품이 포함 된 그리드를 찾을 수 있습니다. 라는 열이 SKU있습니다. 여기에서 값을 기준으로 제품을 필터링 할 수 있습니다.

sku 필터

그런 다음 SKU로 필터링 한 후 왼쪽의 확인란을 사용하여 삭제하려는 모든 항목을 선택할 수 있습니다.

다중 선택

통지 select all전체 그리드의 모든 항목을 선택하고있는 select visible경우에만 그리드의 현재 페이지의 항목을 선택할 것이다있다.

원하는 항목을 선택하면 그리드 오른쪽 상단에있는 대량 작업 단추를 사용하고 삭제 옵션을 선택할 수 있습니다.

대량 작업 삭제

그러면 해당 항목을 삭제할 것인지 묻는 메시지가 나타납니다. 이 팝업에서 예를 선택하면 항목 삭제가 진행됩니다. 색인 설정에 따라이 프로세스 후에 재 색인을 실행해야 할 수도 있습니다.


2
그리고 Select All 은 끔찍한 효율성으로 작동합니다. 어떤 종류의 검색 제약 조건없이 실수로 선택하면 제품 카탈로그의 모든 항목이 실제로 삭제되고 일단 시작되면 서버를 종료하거나 삭제 중 메모리 부족이 중단됩니다.
Fiasco Labs

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에서 레코드를 삭제하면 위 테이블의 일부 레코드도 삭제됩니다.

코드 (구현 Marius의 답변)는 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.