Tengo miles de productos y deseo encontrar todos los productos sin una imagen. Intenté buscar (sin imagen) en la cuadrícula de productos de administrador, pero no obtuve ningún resultado. ¿Cómo puedo hacer una consulta SQL que deshabilite todos estos productos?¿Cómo puedo encontrar todos los productos sin imágenes en Magento?
Respuesta
Escribí un artículo de blog hace un tiempo atrás con una consulta sql para encontrar imágenes faltantes. No deshabilita productos, pero es un comienzo al menos: http://prattski.com/2010/06/29/magento-sql-to-find-missing-images/. Debería ser bastante fácil de hacer a partir de este punto. Puede que tenga que cambiar la identificación del atributo si la suya no coincide con la mía.
Deje de pensar en términos de SQL. Comienza a pensar en términos de los Modelos de Magento. Los modelos de Magento usan SQL como un backend. Es posible realizar consultas vía SQL sin procesar, pero va a variar de una versión a otra de Magento, y puede diferir dependiendo del back-end que esté utilizando.
Ejecute lo siguiente desde una acción de controlador de prueba o en otro lugar desde el que pueda ejecutar el código de Magento. Se consulta el modelo para productos sin imagen
//this builds a collection that's analagous to
//select * from products where image = 'no_selection'
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('image', 'no_selection');
foreach($products as $product)
{
echo $product->getSku() . " has no image \n<br />\n";
//var_dump($product->getData()); //uncomment to see all product attributes
//remove ->addAttributeToFilter('image', 'no_selection');
//from above to see all images and get an idea of
//the things you may query for
}
¿Qué pasa si quieres todos los productos CON imágenes? – swl1020
@ swl1020 No he probado esto, pero un filtro estándar no igual ('neq') debería funcionar. '' -> addAttributeToFilter ('image', array ("neq" => 'no_selection')); 'La lista completa de opciones de filtrado está disponible en este artículo: http://alanstorm.com/magento_collections –
Las colecciones son mucho mejores que depurando las declaraciones de SQL autocompatibles necesarias para trabajar con EAV cualquier día de la semana. El trabajo ya está hecho para ti, solo tienes que prestar atención a la lógica que usas para trabajar con el resultado. –
también, para obtener el SQL que la consulta Alan describe corre detrás de las escenas:
echo (string) $products->getSelect();
Hay dos maneras de hacerlo:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('small_image',array('notnull'=>'','neq'=>'no_selection'));
El código anterior debería funcionar, pero en mi caso no funcionaba. Así que traté de seguir:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('small_image',array('neq'=>'no_selection'));
¡Buena suerte!
Sé que esto es muy antiguo, pero me pareció útil, así que pensé en publicar una actualización.
Como una adición a la respuesta anterior de Alan, encontré que hay otros escenarios además de la 'no_selection' ... ¿quizás debido a complementos o errores generales en el sistema? El nlike final realmente encontrará todo, pero dejé los otros solo por diversión.
Cambie la consulta de colección de la siguiente manera:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(
array (
'attribute' => 'image',
'like' => 'no_selection'
),
array (
'attribute' => 'image', // null fields
'null' => true
),
array (
'attribute' => 'image', // empty, but not null
'eq' => ''
),
array (
'attribute' => 'image', // check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
));
para el producto sin imagen pequeña prueba este
select * from catalog_product_entity_varchar WHERE attribute_id = 86 AND value = 'no_selection'
hallazgo attribute_id en eav_attribute mesa
Yo sólo quiero añadir que la respuesta de Sean Michaud tiene razón, excepto que no necesitamos usar ese
array (
'attribute' => 'image', // null fields
'null' => true
),
El uso de esa página: http://bytes.com/topic/sql-server/answers/83267-wildcard-doesnt-match-using-like-varchar-field-wierd
"es un valor nulo no lo mismo que una cadena de longitud cero.NULL representa la ausencia de cualquier valor, y el estándar SQL dice que un valor NULL nunca es igual a cualquier otro valor que incluye otra NULL"
Así %/%/%
no obtendrá los valores NULL, pero añadiendo el código desde arriba vamos a corregir el error y obtener los campos de imagen con valores nulos. este es el resultado
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(
array (
'attribute' => 'image', // null fields
'null' => true
),
array (
'attribute' => 'image', // check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
));
Si desea trabajar con todos los atributos de la imagen, el código podría ser como este
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(
array (
'attribute' => 'image', //Check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
array (
'attribute' => 'small_image', //Check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
array (
'attribute' => 'thumbnail', //Check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
array (
'attribute' => 'image', //Check for null fields
'null' => true
),
array (
'attribute' => 'small_image', //Check for null fields
'null' => true
),
array (
'attribute' => 'thumbnail', //Check for null fields
'null' => true
),
));
Probé todas estas respuestas en varias combinaciones, y solo obtuve un pequeño subconjunto de mi catálogo. La razón: originalmente importé mis productos usando un script de importación de imagen de producto a medida.
Si no especifiqué imágenes para algunas filas durante la importación, la secuencia de comandos no creó NULL
o valores de atributo vacíos para esas imágenes. Simplemente no creó las filas de atributos en absoluto.
Dado que addAttributeToFilter
usa una unión INNER
de manera predeterminada y no había ningún valor de atributo de imagen al que unirse, las consultas publicadas aquí no captaron esas SKU.
El código siguiente devuelve todos los productos para los cuales la imagen, small_image o miniatura son nulos, con formato incorrecto, o la fila no aparece por completo.
El tercer parámetro para addAttributeToFilter
le permite especificar el tipo de unión que se utilizará junto con las cláusulas OR
de la declaración WHERE
.
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(
array(
array(
'attribute' => 'image',
'null' => '1'
),
array(
'attribute' => 'small_image',
'null' => '1'
),
array(
'attribute' => 'thumbnail',
'null' => '1'
),
array(
'attribute' => 'image',
'nlike' => '%/%/%'
),
array(
'attribute' => 'small_image',
'nlike' => '%/%/%'
),
array(
'attribute' => 'thumbnail',
'nlike' => '%/%/%'
)
),
null,
'left'
);
Si, como yo, que desea convertir esto en una consulta SQL para exportar como CSV desde el cliente de SQL, sólo tiene que imprimir la consulta desde el script PHP:
echo $products->getSelect();
tengo visto algunos SQL publicados en StackOverflow que codifica los números enteros attribute_id
que hacen referencia a los atributos image
, small_image
y thumbnail
, pero estos pueden diferir de una instalación a otra. En Magento, consultar con el ORM es mucho mejor que con el SQL.
he intentado todo, pero esto funciona para mí cuando Catálogo plana es permitir
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(
array(
array(
'attribute' => 'image',
'null' => '1'
),
array(
'attribute' => 'small_image',
'null' => '1'
),
array(
'attribute' => 'thumbnail',
'null' => '1'
),
array(
'attribute' => 'image',
'nlike' => '%/%/%'
),
array(
'attribute' => 'small_image',
'nlike' => '%/%/%'
),
array(
'attribute' => 'thumbnail',
'nlike' => '%/%/%'
)
),
null,
'left'
);
Puede utilizar este SQL sólo para ver qué producto no tiene imágenes:
SELECT * FROM catalog_product_entity_media_gallery RIGHT OUTER JOIN catalog_product_entity ON catalog_product_entity.entity_id = catalog_product_entity_media_gallery.entity_id WHERE catalog_product_entity_media_gallery.value is NULL
buena suerte!
- 1. Magento importa productos con imágenes
- 2. Eliminando TODOS los productos en Magento
- 3. Cómo eliminar todos los productos del catálogo en Magento
- 4. Eliminar imágenes de productos no utilizados en magento
- 5. Magento productos por categorías
- 6. Magento: ¿cómo obtengo productos asociados del Grupo de productos?
- 7. cómo obtener todos los productos ordenados por nombre de producto en magento?
- 8. obtén los últimos productos usando magento soap API
- 9. Magento - sólo productos configurables carga
- 10. Magento: cómo eliminar todos los redireccionamientos permanentes
- 11. ¿Cómo eliminar todos los enlaces de productos de venta cruzada de Magento?
- 12. Encontrar todos los registros sin asociados
- 13. Magento - Buscar agotado Productos con inventario
- 14. Eliminar todos los clientes en Magento
- 15. Los productos de Magento no se mostrarán en la categoría
- 16. MAGENTO - Mostrar productos de la subcategoría en la categoría raíz
- 17. Magento: cómo recuperar imágenes de opciones incluidas
- 18. ¿Cómo puedo encontrar todos los disparadores db en MYSQL?
- 19. ¿Cómo puedo encontrar todos los métodos de extensión en solución?
- 20. cómo obtener todos los productos de la categoría amazon
- 21. Magento: Ordenar una colección de productos
- 22. cómo obtener todos los productos entre dos fechas?
- 23. Magento: actualizar catálogos de productos más rápido
- 24. ¿Cómo encontrar un evento apropiado en Magento?
- 25. Magento: paginate colección de productos filtrados
- 26. ¿Cómo encontrar todos los procesos secundarios?
- 27. python - encontrar char en cadena - ¿puedo obtener todos los índices?
- 28. imágenes de los productos que no presenten después de la migración de la página web de Magento
- 29. Magento obtener una colección de productos en un orden arbitrario
- 30. ¿Cómo detener a Magento que requiere dos descripciones de productos?
@Michael Myers: ¿Por qué exactamente editó esto casi un año completo después de su publicación? –
@ Zéychin: no hay un plazo de vigencia para las ediciones. Cada vez que vea algo que podría mejorarse, siéntase libre de seguir adelante y hacerlo. En este caso, estuve aquí porque alguien publicó una no respuesta que vine a eliminar. –
Oh sí, eso es justo. Acabo de ver: editado por ..., y por la forma en que se coloca, parece que aparentemente editó la pregunta, no eliminó la respuesta (falsa). Eso tiene mucho más sentido. Saludo tu trabajo para esta comunidad. –