Cuatro atributos en un solo producto. Diecinueve valores en el primero, ocho, ocho y tres. Esto equivale a 3,648 variantes de un artículo, y no es una simple hipótesis: un comerciante reportó exactamente esto en el sistema de seguimiento de incidencias de PrestaShop , en 30 productos y más de 100 000 filas de la base de datos.
Las páginas de sus productos caducaron y el panel de administración devolvió una pantalla blanca en blanco.
Nada se había roto. El catálogo funcionaba exactamente como había sido diseñado, a una escala que nadie había optimizado.
El problema que muchos propietarios descubren cuando ya es demasiado tarde: las combinaciones de productos de PrestaShop son exponentes, no sumas. Diez valores en un grupo y diez en otro dan como resultado cien variantes de precio, stock y fotografía, no veinte. Una gestión eficaz de las combinaciones de productos de PrestaShop comienza ahí.
1.0 Atributos y combinaciones de PrestaShop: ¿cuál es la diferencia?
Hay dos términos que se confunden constantemente, y la diferencia determina cómo se construye el catálogo.
Los atributos del producto en PrestaShop son las opciones que elige el cliente: tamaño, color, capacidad de almacenamiento. Una característica es un texto descriptivo que aparece en la página y no se puede seleccionar: peso, material, país de origen. La propia documentación de PrestaShop lo explica claramente: un cliente puede comprar una versión del iPad según el color y el espacio de almacenamiento, pero no según el peso.
Si te equivocas en esto, te saldrá caro de cualquier manera. Si tratas una característica como un atributo, generarás cientos de variantes entre las que nadie podrá elegir, cada una con filas en cinco tablas. Lo contrario es peor: los clientes no podrán comprar la versión que buscan.
La estructura se compone de tres capas. Un grupo de atributos, como Tamaño, contiene valores como Pequeño y Mediano, y una combinación es un par que abarca todos los grupos. En el backend, esto se representa como una fila en product_attribute , que incluye su propia referencia, ajuste de precio, peso y existencias.
2.0 ¿Por qué se multiplican tan rápidamente las combinaciones de productos de PrestaShop?
El producto cartesiano completo —cada valor de cada grupo junto con cada valor de los demás grupos— es lo que genera el generador de combinaciones de PrestaShop . El número de variantes de producto en PrestaShop es el resultado de multiplicar esos valores, no de sumarlos.
Observa lo rápido que se te escapa de las manos.

Tres grupos, sesenta variantes. Un cuarto grupo de tres valores lo elevaría a 180.
| Grupos de atributos | Valores en cada uno | Combinaciones creadas |
| 2 (Tamaño, Color) | 5 y 4 | 20 |
| 3 (Tamaño, Color, Material) | 5, 4 and 3 | 60 |
| 4 (Tamaño, Color, Material, Acabado) | 5, 4, 3 3 y | 180 |
| 4 (según se informa en el número 12915) | 19, 8, 8 3 y | 3,648 |
Añade un grupo más de tres valores y el total se triplicará. No se trata de sumar tres, sino de multiplicarlo por tres. Este detalle suele confundir a más comerciantes que cualquier otro aspecto de la gestión de combinaciones de PrestaShop.

Antes de hacer clic en Generar, conviene saber que la plataforma no impone ningún límite superior . El generador es recursivo y produce combinaciones de una en una, sin que se haya definido un máximo en ninguna parte de la clase.
3.0 Qué hace la base de datos cuando se generan combinaciones
Una sola combinación nunca es una sola fila. Ni mucho menos. Ese es el detalle que la gente pasa por alto cuando mira un catálogo enorme y se pregunta de dónde salió ese tamaño.
Genera una combinación y PrestaShop escribe en cinco tablas diferentes:
- atributo_del_producto Contiene la combinación en sí, con su referencia e impacto en el precio.
- Los precios y la configuración de existencias específicos de cada tienda se incluyen en tienda_de_atributos_de_productouna fila por tienda.
- combinación_de_atributos_del_producto vincula la combinación con sus valores de atributos. Fundamentalmente, esto es una fila por atributo, por lo que una combinación de cuatro atributos escribe cuatro filas aquí por sí sola.
- Las existencias viven en existencias disponibles, de nuevo por tienda.
- Finalmente, idioma_atributo_producto Almacena las etiquetas de disponibilidad, una fila por idioma.

Cinco tablas por combinación, dos de las cuales se adaptan al número de atributos e idiomas.
Ahora, realiza los cálculos en ese producto de 3,648 combinaciones, suponiendo cuatro atributos, dos idiomas y una tienda. Obtendrás 3,648 filas para product_attribute, otras 3,648 para product_attribute_shop, 2 1 para product_attribute_combination, 3,648 para stock_available y 7,296 para product_attribute_lang. Eso da un total de 14,592 32,832 filas para un solo producto.
Si multiplicamos por 30 productos, nos acercamos al millón de filas. El comerciante de ese número reportó más de 100 000, lo que lo sitúa en el extremo conservador.
Los idiomas y las tiendas multiplican el total nuevamente, por lo que tres idiomas en dos tiendas no añaden una pequeña sobrecarga a la gestión de variantes de productos de PrestaShop . Varios de esos recuentos se multiplican directamente.
4.0 Rendimiento combinado de PrestaShop para catálogos grandes
El almacenamiento es barato, y un millón de filas no suponen nada para una base de datos. Entonces, ¿por qué esas páginas de productos se ralentizaban tanto?
La respuesta reside en el controlador de primera línea, y es más específica que una simple lentitud general.
Al abrir la página de un producto como cliente, PrestaShop llama a getAttributesGroups() sin ningún filtro, limitándolo a la combinación que se muestra en pantalla. Se devuelven todas las filas de combinaciones para ese producto. Las 3,648, en cada visualización de página, antes de que el visitante haya hecho clic en nada.
Entonces, el precio sube. El controlador recorre esas filas y llama a Product::getPriceStatic() una vez por cada combinación para determinar si se aplica un precio específico. Casi cuatro mil cálculos de precios, cada uno con su propia lógica de impuestos y descuentos, para renderizar una sola página.

Aquí nada depende de lo que elija el visitante. El trabajo se realiza de todos modos.
Los desarrolladores de PrestaShop lo saben. Justo encima de esa consulta en el código fuente de la versión 8.2.6, hay un comentario de un mantenedor principal que pregunta si el código debería obtener solo los grupos en lugar de todas las variantes. Esta pregunta lleva años presente en el código.
De este diseño se derivan dos consecuencias prácticas:
- El tiempo de carga de la página depende del número de combinaciones posibles, no de las que seleccione el cliente. Un producto con 3,600 variantes resulta lento incluso para un visitante que se marcha inmediatamente.
- Las reglas de precios específicas lo empeoran, porque cada una agrega trabajo dentro de un bucle que ya se ejecuta miles de veces. Esta es la trampa más grande en Gestión combinada de catálogos grandes de PrestaShop.
Es importante saber que una tienda sin combinaciones omite la consulta por completo, ya que Combination::isFeatureActive() devuelve un resultado anticipado.
5.0 Cómo gestionar miles de combinaciones de productos en PrestaShop
5.1 Recorta el número de atributos antes que nada.
Cada grupo que elimines divide tu total, por lo que este es el cambio con mayor efecto, y técnicamente no cuesta nada.
Para cada grupo, haz una pregunta directa: ¿un cliente se negará a comprar si no puede elegir esto? El acabado, el tipo de embalaje y el número de hilos generalmente no superan esa prueba. Trasládalos a las características.
Si eliminamos un grupo de tres valores de ese producto de 3,648 combinaciones, nos quedamos con 1,216. Una sola decisión y dos tercios de las filas desaparecen.
5.2 Dividir en productos separados cuando una variante es realmente un producto.
Para las variaciones genuinas de un mismo artículo, los atributos son importantes. Si las opciones difieren lo suficiente como para que los clientes las busquen por separado, o si se requieren fotografías y URL distintas, entonces se trata de productos diferentes con una apariencia variante.
Los productos individuales también se indexan mejor, ya que cada uno tiene su propia URL y meta descripción. Una combinación no tiene ninguna de las dos.
5.3 Generar y editar en lote
Para la gestión de combinaciones de productos en PrestaShop , el generador supera con creces la creación manual de variantes. Genera el conjunto completo y luego elimina los productos que no tienes en stock, que es la clave para gestionar las combinaciones de productos en PrestaShop . Durante la generación, PrestaShop desactiva ciertas reglas de precios y las aplica en una sola pasada al final, por lo que la primera ejecución es más rápida de lo que parece.
La regeneración sobre un conjunto existente se comporta de manera diferente. Antes de crear cada combinación, PrestaShop consulta la base de datos para comprobar si ese par de atributos ya existe. Miles de combinaciones, miles de consultas. Por lo tanto, una segunda ejecución resulta mucho más lenta que la primera.
5.4 Cuando una combinación es la herramienta completamente equivocada
Al eliminar grupos de atributos surge una pregunta obvia: ¿qué sucede con la opción que acabas de eliminar? A veces se convierte en una característica. Otras veces, ninguna de las dos opciones encaja.
Texto para grabado, monograma, fecha de entrega, logotipo subido. Ninguno puede ser una combinación, ya que una combinación requiere una lista finita de valores definidos de antemano.
Estos pertenecen a un campo de producto personalizado, que PrestaShop denomina personalización:
- Una combinación es finita, está definida de antemano y mantiene existencias. Cada una cuesta filas en cinco tablas.
- Abierto y completado por su cliente: El campo personalizado no ocupa espacio en su inventario y tiene el mismo coste para productos con 3 variaciones que para productos con 3000 de ellas.
Ambos funcionan conjuntamente. Una camiseta puede incluir la talla y el color como combinaciones, a la vez que admite un nombre impreso como campo personalizado, y la línea de pedido muestra ambos.
Hay un detalle importante que conviene tener en cuenta. PrestaShop identifica una línea de carrito por producto y combinación, por lo que dos clientes que pidan la misma taza con un grabado diferente se agruparían en una sola línea con cantidad dos. Los módulos que solucionan este problema sobrescriben los métodos Cart::updateQty , Cart::getProducts y Cart::deleteProduct , y luego aplican un hash a los valores enviados para mantener las líneas separadas.
5.5 Dos problemas que solo aparecen una vez realizado el pedido.
El pedido almacena la combinación dentro del nombre del producto. Cuando se realiza un pedido, PrestaShop no guarda una referencia a la combinación para buscarla posteriormente. Escribe la combinación en el nombre y almacena esa cadena, por lo que order_detail.product_name termina conteniendo algo como camiseta estampada de colibrí (Talla: S – Color: Blanco ).

Con cada atributo que se asigna a un campo, la cadena se alarga en un elemento, ya que se le añade cada valor y grupo. Cuatro grupos generan una cola larga en un nombre que ya de por sí es largo.
El problema radica en el ancho de la columna, y este varía según la versión de PrestaShop que utilice.
PrestaShop 1.7, el ancho de la columna es varchar(255). 8 y 9 usan MEDIUMTEXT, y también parece indicar que el tamaño varchar para este campo en 1.7 no está declarado, y la longitud no se comprueba antes de la inserción y simplemente MySQL la trunca después de 255 caracteres.
Nadie ve el error. El pedido se guarda y la pérdida aparece más tarde en la factura o en la lista de pedidos, donde dos variantes pueden parecer idénticas porque la pieza que las diferencia es la que se cortó. Actualizar a una versión posterior a la 1.7 elimina el límite.
El texto de personalización se pasa al correo electrónico de confirmación como una cadena, y PrestaShop genera dinámicamente este texto en PHP con el marcado deseado, con las etiquetas entre corchetes y las entradas delimitadas por <br />. La plantilla de correo electrónico luego reproduce el valor sin usar la etiqueta `marked safe`, y como las plantillas de correo se ejecutan con el escape de Smarty habilitado, todas esas etiquetas se transforman en entidades.

El cliente lee las etiquetas en lugar de ver una etiqueta en negrita y un salto de línea. Envíate un pedido de prueba con un producto personalizado, ya que el mismo pedido puede aparecer correctamente en la factura en PDF, mientras que el correo electrónico muestra el código fuente sin formato.
5.6 Observa lo que hacen los precios específicos.
Cada regla de precio específica añade trabajo dentro de ese bucle por combinación, por lo que unas pocas reglas no cuestan nada en un catálogo pequeño y se convierten en todo un problema en uno grande. Recordemos al comerciante del número 12915: un precio personalizado diferente para cada una de las 3,600 variantes.
Cuando una diferencia de precio afecta a todo un grupo, utilice el campo de impacto de precio combinado en lugar de una regla de precio específica. Este campo se encuentra en la misma fila de la combinación y su lectura no tiene costo adicional.
6.0 ¿Qué cambió entre PrestaShop 1.7 y 9?
Hay muchas, y las diferencias importan si estás siguiendo un tutorial antiguo.
En PrestaShop 9, la página de producto anterior ya no existe. La página rediseñada, introducida en la versión 1.7 y perfeccionada en la serie 8.x, es ahora la única opción disponible. Las notas para desarrolladores de la versión 9.0 confirman que la página antigua ya no se puede acceder. Por lo tanto, todas las capturas de pantalla de los tutoriales anteriores muestran una interfaz que no está disponible.
Los autores de módulos tienen más cosas que revisar. Todos los hooks vinculados a la antigua página de producto desaparecieron en la versión 9.0, incluida la familia actionAdminProductsController . ¿Dependes de uno para gestionar combinaciones? Ese módulo necesita ser reescrito.
Dos cambios en los datos también causan problemas. El atributo attribute_price ya no aparece en Product::getProductProperties , y las características ya no se incluyen por defecto en getProductsProperties. Ambos fallos se producen de forma silenciosa.
En cuanto al rendimiento, hay buenas noticias recientes. PrestaShop 9.1 incluyó una mejora significativa en el rendimiento del carrito de compra para tiendas con muchas combinaciones de productos, según sus notas de lanzamiento . ¿Utilizas un catálogo de variantes extenso en la versión 9.0? Solo eso ya justifica la actualización.
Un cambio de esquema es importante si todavía usa la versión 1.7. La columna order_detail.product_name era varchar(255) en esa versión y es MEDIUMTEXT en las versiones 8 y 9, por lo que la actualización elimina el truncamiento silencioso descrito anteriormente.
Sin embargo, el comportamiento fundamental no ha cambiado. Las combinaciones siguen siendo un producto cartesiano, sin límite, distribuidas en las mismas cinco tablas, y contar antes de generar es tan importante en la versión 9 como lo era en la 1.7.
7.0 Un orden práctico para trabajar en
Ante un catálogo que se ha vuelto inmanejable, siga estos pasos en orden. La respuesta breve a cómo gestionar variantes de productos a gran escala en PrestaShop.
- Primero, cuenta. Multiplica los valores de tus atributos antes de hacer clic en Generar. Si superas los cientos en un solo producto, detente y reconsidera.
- ¿Podría algún grupo de atributos ser una característica en su lugar, o un campo personalizado abierto?
- ¿Qué variantes merecen su propia página de producto? Cualquier cosa que desees encontrar por separado en la búsqueda.
- Verifique las reglas de precios específicas para productos con muchas variantes, reemplazando lo que pueda con el campo de impacto de precio de la combinación.
- Realice un pedido de prueba de un producto con varios atributos y una personalización, luego lea la línea del pedido y el correo electrónico de confirmación. Los nombres largos se truncan en la versión 1.7 y el correo electrónico pierde su propio formato.
- ¿Utilizas PrestaShop 9.0 con un catálogo de variantes extenso? Actualiza a la versión 9.1 para mejorar el rendimiento del carrito.
8.0 La versión corta
Las combinaciones se multiplican, y esa multiplicación llega a la base de datos más rápido de lo que la mayoría de los comerciantes esperan. Cinco tablas por combinación. Un producto de cuatro atributos con unos miles de variantes puede contener 30 000 filas.
El problema de rendimiento se presenta en la página del producto, no en el almacenamiento. PrestaShop carga todas las combinaciones y calcula el precio de cada una individualmente, en cada vista, independientemente de si el visitante abre o no el menú desplegable.
La solución más eficaz sigue siendo la más sencilla. Menos grupos de atributos significan exponencialmente menos combinaciones, así que realiza la multiplicación antes de generar nada.
Gracias por leer.
Si tiene preguntas o necesita ayuda con el rendimiento o la migración de su sitio web, nuestros expertos están aquí para ayudarle. Póngase en contacto con el equipo de Knowband en [email protected] hoy mismo para obtener plugins de comercio electrónico fiables y adaptados a sus necesidades.

