Eliminar múltiples productos en Magento

12

¿Hay alguna forma de eliminar múltiples productos al filtrar con SKU? Tengo alrededor de 1000 productos que quiero eliminar.

Kevin S
fuente

Respuestas:

17

La forma más rápida de hacerlo es ejecutar esta consulta directamente.

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

Todo debería caer en cascada muy bien. los valores de los atributos se eliminarán, las relaciones de categoría se eliminarán, las ventas adicionales, las ventas cruzadas y las relacionadas, etc.

[EDITAR]
Hay un problema con esto. Gracias a STW por detectar esto. Las revisiones y calificaciones permanecerán huérfanas porque no hay una clave externa para la tabla de productos para ellos.

Marius
fuente
55
no olvide reindexar después de esto (si usa un catálogo de productos plano)
Vladimir Kerkhoff
2
Esto es básicamente lo que hace la herramienta Admin Import / Export cuando la usa para realizar eliminaciones masivas. Es extremadamente rápido en comparación con las llamadas, ->delete()pero esquivará cualquier código que escuche eventos. En existencia, Magento parece que las reseñas y clasificaciones quedarán huérfanas (no se eliminarán cuando su producto asociado lo esté).
STW
@STW. Buena atrapada. Me olvidé por completo de las reseñas y calificaciones.
Marius
No estoy seguro de si es buena idea o no. ¿Qué pasa con los datos de atributos que se guardaron en las tablas eav? ¿están borrados también?
Anurag Patbandha
@AnuragPatbandha. Todas las catalog_product_entity_*tablas tienen un FK en el entity_idcampo al catalog_product_entity.entity_idcampo. Deben caer en cascada muy bien.
Marius
15

Todo el debido respeto a Marius, pero no interactúe con la base de datos directamente si es evitable. Tal vez las tablas relacionadas se actualicen automáticamente, si su lanzamiento de Magento y todas sus extensiones están libres de errores en todos los lugares correctos. Pero si no lo son, ese tipo de cosas pueden destruir su sitio.

En su lugar, puede usar la característica de importación CSV de Magento.

Simplemente enumere sus SKU en un archivo, simple como:

sku
ABC1
ABC2
ABC3

... etc. Luego guárdelo como un archivo CSV.

Luego, en Sistema> Importar / Exportar> Importar, seleccione Tipo de entidad: Productos e Importar comportamiento: Eliminar entidades e importe este archivo. ¡Y eso es!

Doug McLean
fuente
2
para su información: en general, estoy de acuerdo en que evitar la interacción directa de DB es lo mejor; sin embargo, así es como Magento elimina productos a través de la herramienta de importación de administración (ver Mage_ImportExport_Model_Import_Entity_Product::_deleteProducts())
STW
supongamos que si quiero eliminar productos de la tienda seleccionada, ¿cuál es mi formato CSV?
zus
Si solo desea desasignar productos de una tienda seleccionada pero no eliminarlos de la base de datos, puede intentar una importación CSV con dos columnas: sku y store, asegúrese de que la columna store contenga solo las ID de tienda a las que desea asignar el producto. , seleccione Importar comportamiento: actualizar e importar eso. Sin embargo, no he probado esto, ¡así que proceda con precaución! (Si encuentro tiempo, probaré esto más tarde y agregaré otro comentario)
Doug McLean
6

Puedes hacerlo programáticamente. Cree un skustodelete.csv que enumere todos los skus que se eliminarán y después de eso, aquí está el código para continuar

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

La forma sin código

En la sección de administración debajo Manage Productsencontrará una grilla con todos sus productos. Hay una columna llamada SKU. Aquí puede filtrar sus productos según el valor.

filtro sku

Luego, una vez que haya filtrado por SKU, puede usar las casillas de verificación en el lado izquierdo para seleccionar todos los elementos que desea eliminar.

selección múltiple

Observe select allque seleccionará todos los elementos en la cuadrícula completa y select visibleque solo seleccionará elementos en la página actual de la cuadrícula.

Una vez que haya seleccionado los elementos que desea, puede usar el botón de acción masiva en la parte superior derecha de la cuadrícula y seleccionar la opción Eliminar.

eliminar acción masiva

Esto le pedirá que se asegure de que desea eliminar estos elementos. Después de seleccionar sí a esta ventana emergente, procederá a eliminar sus elementos. Dependiendo de la configuración de su índice, es posible que deba volver a indexar después de este proceso.

David modales
fuente
2
Y Select All funciona con una eficiencia aterradora. Elegirlo accidentalmente sin ningún tipo de restricciones de búsqueda realmente elimina todo en su catálogo de productos, y una vez que comienza, matar el servidor o quedarse sin memoria durante la eliminación son las únicas cosas que lo detienen.
Fiasco Labs
3

Kevin S, puede eliminar el producto por archivo csv. Solo sigue el paso ondulante

Paso 1 :

Cree un archivo csv y pegue los skus que desea eliminar del sistema. Dé el nombre del archivo como skus.csv

Paso 2 :

Crea y reemplaza un archivo php en tu directorio raíz. Luego pasa el siguiente código

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

Nota: Antes de ejecutar este código, le recomendé que debe obtener la copia de seguridad. Espero que sea de ayuda.

Supravat M
fuente
0

Porque listar tablas

  • 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
  • catálogo_producto_enlace

son claves foráneas de catalog_product_entity.

Entonces, cuando elimine un registro en catalog_product_entity, también se eliminarán algunos registros de las tablas anteriores.

El código (implementar la respuesta de Marius) elimina todos los productos que tienen 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);
Christian Nguyen
fuente