Quatro atributos em um produto. Dezenove valores no primeiro, oito, oito e três. Isso equivale a 3,648 variantes de um item, e não é mera hipótese: um lojista relatou exatamente isso no sistema de rastreamento de problemas do PrestaShop , em 30 produtos e mais de 100,000 linhas de banco de dados.
As páginas dos produtos expiraram e o painel administrativo retornou uma tela branca em branco.
Nada havia quebrado. O catálogo estava funcionando exatamente como planejado, em uma escala para a qual ninguém havia otimizado.
O problema que muitos proprietários descobrem tarde demais: as combinações de produtos no PrestaShop são exponenciais, não somatórias. Dez valores em um grupo e dez em outro resultam em cem variantes de preço, estoque e foto, não vinte. Uma boa gestão de combinações de produtos no PrestaShop começa aí.
1.0 Atributos e combinações do PrestaShop: qual a diferença?
Dois termos são constantemente confundidos, e a diferença entre eles determina como você constrói seu catálogo.
Os atributos de produto do PrestaShop são as opções que o cliente escolhe: tamanho, cor, capacidade de armazenamento. Já as características são textos descritivos que aparecem na página e não podem ser selecionados: peso, material, país de origem. A própria documentação do PrestaShop explica isso de forma clara: um cliente pode comprar uma variação de iPad com base na cor e no espaço em disco, mas não com base no peso.
Se você errar nisso, vai pagar caro de qualquer jeito. Tratar uma funcionalidade como um atributo gera centenas de variantes entre as quais ninguém vai escolher, cada uma com linhas em cinco tabelas diferentes. O contrário é pior: os clientes não conseguem comprar a versão que queriam.
A estrutura é composta por três camadas. Um grupo de atributos, como Tamanho, contém valores como Pequeno e Médio, e uma combinação é um par que abrange todos os grupos. No backend, isso corresponde a uma linha em `product_attribute` , contendo sua própria referência, ajuste de preço, peso e estoque.
2.0 Por que as combinações de produtos do PrestaShop se multiplicam tão rapidamente?
O produto cartesiano completo — cada valor de cada grupo somado a cada valor de cada um dos outros grupos — é o que o gerador de combinações do PrestaShop produz. A sua contagem de variantes de produto no PrestaShop é o resultado da multiplicação desses números, e não da sua soma.
Veja como isso pode sair do seu controle rapidamente.

Três grupos, sessenta variantes. Um quarto grupo de três valores elevaria o total para 180.
| Grupos de atributos | Valores em cada | Combinações criadas |
| 2 (Tamanho, Cor) | 5 e 4 | 20 |
| 3 (Tamanho, Cor, Material) | 5, 4 e 3 | 60 |
| 4 (Tamanho, Cor, Material, Acabamento) | 5, 4, 3 e 3 | 180 |
| 4 (conforme relatado na edição nº 12915) | 19, 8, 8 e 3 | 3,648 |
Adicione mais um grupo de três valores e o total triplica. Não mais três: três vezes três. Esse detalhe é o que mais confunde os lojistas na gestão de combinações do PrestaShop.

É importante saber antes de clicar em Gerar: a plataforma não impõe limite máximo . O gerador é recursivo, produzindo combinações uma de cada vez, sem nenhum valor máximo definido em toda a classe.
3.0 O que o banco de dados faz quando você gera combinações
Uma única combinação nunca corresponde a uma única linha. Longe disso. Esse é o detalhe que as pessoas ignoram quando olham para um catálogo extenso e se perguntam de onde veio aquele tamanho.
Ao gerar uma combinação, o PrestaShop grava em cinco tabelas separadas:
- atributo_do_produto Contém a própria combinação, com sua referência e impacto no preço.
- As configurações de preços e estoque específicas da loja são inseridas em loja_de_atributos_do_produto, uma fileira por loja.
- combinação_de_atributos_do_produto vincula a combinação aos seus valores de atributo. Fundamentalmente, isto é uma linha por atributoPortanto, uma combinação de quatro atributos gera quatro linhas aqui por si só.
- Stock vive em estoque_disponível, novamente por loja.
- Finalmente, idioma_do_atributo_do_produto Armazena os rótulos de disponibilidade, uma linha por idioma.

Cinco tabelas por combinação, duas das quais são escaláveis de acordo com a quantidade de atributos e idiomas.
Agora, faça os cálculos com esse produto de 3,648 combinações, considerando quatro atributos, dois idiomas e uma loja. Você obterá 3,648 linhas para `product_attribute`, outras 3,648 para `product_attribute_shop`, 14,592 para `product_attribute_combination`, 3,648 para `stock_available` e 7,296 para `product_attribute_lang`. Isso resulta em 32,832 linhas para um único produto.
Multiplique por 30 produtos e você se aproxima de um milhão de linhas. O comerciante daquela edição relatou mais de 100,000, o que o coloca na extremidade mais conservadora.
Idiomas e lojas multiplicam o total novamente, portanto, três idiomas em duas lojas não adicionam uma pequena sobrecarga ao gerenciamento de variantes de produtos do PrestaShop . Várias dessas contagens se multiplicam diretamente.
4.0 Desempenho combinado do PrestaShop para grandes catálogos
O armazenamento é barato e um milhão de linhas não é nada para um banco de dados. Então, por que essas páginas de produtos foram indexadas?
A resposta está no controlador da área administrativa, e é mais específica do que uma simples lentidão.
Ao abrir a página de um produto como cliente, o PrestaShop chama o método `getAttributesGroups()` sem filtro, restringindo-o à combinação exibida na tela. Todas as 3,648 linhas de combinação para aquele produto são retornadas. Em cada visualização de página, antes mesmo do visitante clicar em qualquer item.
Então, o preço aumenta. O controlador percorre essas linhas e chama `Product::getPriceStatic()` uma vez para cada combinação, a fim de determinar se um preço específico se aplica. São quase quatro mil cálculos de preço, cada um executando sua própria lógica de impostos e descontos, para renderizar uma única página.

Nada aqui depende da escolha do visitante. O trabalho acontece de qualquer maneira.
Os desenvolvedores do PrestaShop estão cientes disso. Logo acima dessa consulta no código-fonte da versão 8.2.6, há um comentário de um mantenedor principal perguntando se o código deveria buscar apenas os grupos em vez de todas as variantes. Essa questão está presente no código-fonte há anos.
Desse projeto decorrem duas consequências práticas:
- O tempo de carregamento da página é proporcional à quantidade de combinações, não ao que o cliente seleciona. Um produto com 3,600 variantes é lento mesmo para um visitante que sai imediatamente.
- Regras de preço específicas pioram a situação, porque cada uma adiciona trabalho dentro de um ciclo que já é executado milhares de vezes. Essa é a maior armadilha em... Gerenciamento de combinação de catálogo grande do PrestaShop.
Vale a pena saber: uma loja sem combinações ignora completamente a consulta, já que Combination::isFeatureActive() retorna antecipadamente.
5.0 Como gerenciar milhares de combinações de produtos no PrestaShop
5.1 Reduza a quantidade de atributos antes de qualquer outra coisa
Cada grupo que você remove divide o seu total, então essa é a mudança com o maior efeito, e tecnicamente não custa nada.
Para cada grupo, faça uma pergunta direta: um cliente se recusaria a comprar se não pudesse escolher isso? Acabamento, tipo de embalagem e número de fios geralmente não passam nesse teste. Mova-os para a seção de recursos.
Remova um grupo de três valores desse produto de 3,648 combinações e você ficará com 1,216. Uma decisão e dois terços das linhas desaparecem.
5.2 Dividir em produtos separados quando uma variante é, na verdade, um produto
Para variações genuínas de um mesmo item, os atributos são adequados. Quando as opções diferem o suficiente para que os clientes as pesquisem separadamente, ou quando você deseja fotos e URLs distintas, esses são produtos separados com uma identidade visual diferente.
Produtos separados também têm melhor indexação, já que cada um recebe seu próprio URL e meta descrição. Uma combinação não recebe nenhuma das duas.
5.3 Gere e edite em massa
Para combinações em massa no PrestaShop , o gerador é mais eficiente do que criar variantes manualmente. Gere o conjunto completo e, em seguida, exclua o que você não tem em estoque; essa é a essência prática do gerenciamento de combinações de produtos em massa no PrestaShop . Durante a geração, o PrestaShop desativa regras de preço específicas e as aplica em uma única etapa no final, tornando a primeira execução mais rápida do que parece.
A regeneração a partir de um conjunto existente comporta-se de forma diferente. Antes de criar cada combinação, o PrestaShop consulta a base de dados para verificar se esse par de atributos já existe. Milhares de combinações, milhares de consultas. Por isso, uma segunda execução parece muito mais lenta do que a primeira.
5.4 Quando uma combinação é a ferramenta totalmente errada
Ao cortar grupos de atributos, surge uma questão óbvia: o que acontece com a opção que você acabou de remover? Às vezes, ela se torna um recurso. Às vezes, nenhuma das duas opções se encaixa.
Gravar um texto, um monograma, uma data de entrega, um logotipo carregado. Nenhum deles pode ser uma combinação, pois uma combinação requer uma lista finita de valores definidos antecipadamente.
Esses elementos pertencem a um campo de produto personalizado, que o PrestaShop chama de personalização:
- Uma combinação é finita, definida antecipadamente e possui ações. Cada uma custa linhas em cinco tabelas.
- Aberto e preenchido pelo seu cliente: O campo personalizado não ocupa espaço no seu estoque, tendo o mesmo custo para produtos com 3 variações ou com 3000 delas.
Os dois funcionam em conjunto. Uma camiseta pode conter tamanho e cor como combinações, além de um nome impresso como campo personalizado, e a linha do pedido exibe ambos.
É importante saber primeiro um detalhe importante. O PrestaShop identifica uma linha do carrinho pelo produto e combinação, então dois clientes que encomendam a mesma caneca com gravações diferentes seriam agrupados em uma única linha com quantidade dois. Os módulos que resolvem esse problema sobrescrevem os métodos `Cart::updateQty` , `Cart::getProducts` e `Cart::deleteProduct` , e então aplicam um hash aos valores enviados para manter as linhas separadas.
5.5 Dois problemas que só aparecem depois que um pedido é feito.
O pedido armazena a combinação dentro do nome do produto. Quando um pedido é feito, o PrestaShop não mantém uma referência à combinação para buscá-la posteriormente. Ele grava a combinação no nome e armazena essa string, então order_detail.product_name acaba contendo algo como " Camiseta estampada de beija-flor (Tamanho: P – Cor: Branca)".

A cada atributo definido para um campo, a string aumenta em um item à medida que valores e grupos são adicionados. Quatro grupos resultam em um nome já extenso, resultando em uma cauda longa.
O problema reside na largura da coluna, que varia conforme a versão do PrestaShop.
No PrestaShop 1.7, a largura da coluna é varchar(255). As versões 8 e 9 usam MEDIUMTEXT, e parece que o tamanho varchar para este campo na versão 1.7 não está declarado, e o comprimento não é verificado antes da inserção, sendo simplesmente truncado pelo MySQL após 255 caracteres.
Ninguém vê o erro. O pedido é salvo, e a perda aparece mais tarde na fatura ou na lista de pedidos, onde duas variantes podem parecer idênticas porque a peça que as diferencia é justamente a que foi cortada. Atualizar para uma versão posterior à 1.7 remove o limite máximo.
O texto de personalização é passado para o e-mail de confirmação como uma string, e o PrestaShop gera esse texto dinamicamente em PHP com a marcação desejada, com os rótulos inseridos e as entradas delimitadas por <br />. O modelo de e-mail então reproduz o valor sem usar tags de segurança, e como os modelos de e-mail são executados com o recurso de escape do Smarty ativado, todas essas tags são transformadas em entidades.

O cliente lê as etiquetas em vez de ver um rótulo em negrito e uma quebra de linha. Envie um pedido de teste para si mesmo com um produto personalizado, já que o mesmo pedido pode ser exibido corretamente na fatura em PDF, enquanto o e-mail mostra a formatação original.
5.6 Observe o comportamento de preços específicos.
Cada regra de preço específica adiciona trabalho dentro desse loop por combinação, e é por isso que algumas regras não custam nada em um catálogo pequeno, mas se tornam o problema principal em um catálogo grande. Lembre-se do comerciante da edição nº 12915: um preço personalizado diferente para cada uma das 3,600 variantes.
Quando uma diferença de preço se aplica a um grupo inteiro, use o campo de impacto de preço combinado em vez de uma regra de preço específica. Ele fica na própria linha de combinação e não custa nada a mais para ler.
6.0 O que mudou entre o PrestaShop 1.7 e o 9?
Há muitas, e as diferenças são importantes se você estiver seguindo um tutorial mais antigo.
No PrestaShop 9, a página de produto antiga foi removida. A página reconstruída, introduzida na versão 1.7 e aprimorada nas versões 8.x, é agora a única opção disponível. As notas de desenvolvedor da versão 9.0 confirmam que a página antiga não pode ser acessada. Portanto, todas as capturas de tela em tutoriais anteriores mostram uma interface que você não possui.
Os autores de módulos têm mais coisas para verificar. Todos os hooks vinculados à página de produto antiga desapareceram na versão 9.0, juntamente com a família actionAdminProductsController . Se você depende de um deles para lidar com combinações de produtos, esse módulo precisa ser reescrito.
Duas alterações nos dados também estão causando problemas. O atributo `price` foi removido de `Product::getProductProperties` , e os recursos não são mais incluídos por padrão em `getProductsProperties`. Ambas as falhas ocorrem silenciosamente.
Em relação ao desempenho, há boas notícias recentes. O PrestaShop 9.1 trouxe o que suas notas de lançamento descrevem como uma melhoria significativa no desempenho do carrinho para lojas com muitas combinações de produtos . Tem um catálogo extenso de variantes na versão 9.0? Só isso já justifica a atualização.
Uma alteração no esquema é importante se você ainda estiver na versão 1.7. A coluna order_detail.product_name era varchar(255) nessa versão e é MEDIUMTEXT nas versões 8 e 9, portanto, a atualização remove o truncamento silencioso descrito acima.
O comportamento fundamental, porém, não mudou. As combinações continuam sendo um produto cartesiano, sem limite, distribuídas pelas mesmas cinco tabelas, e a contagem antes da geração é tão importante na versão 9 quanto era na 1.7.
7.0 Uma ordem prática para trabalhar em
Diante de um catálogo que se tornou difícil de gerenciar, trabalhe com esses itens em ordem. A resposta curta para como lidar com variantes de produtos em grande escala no PrestaShop.
- Primeiro, conte. Multiplique os valores dos seus atributos antes de clicar em Gerar. Se passar de algumas centenas em um produto, pare e reconsidere.
- Será que algum grupo de atributos poderia ser uma funcionalidade ou um campo personalizado aberto?
- Quais variantes merecem sua própria página de produto? Qualquer item que você queira que apareça separadamente na busca.
- Verifique as regras de preço específicas para produtos com alta variação, substituindo o que for possível pelo campo de impacto de preço combinado.
- Faça um pedido de teste de um produto com vários atributos e uma personalização e, em seguida, leia a linha do pedido e o e-mail de confirmação. Nomes longos são truncados na versão 1.7 e o e-mail escapa sua própria marcação.
- Está usando o PrestaShop 9.0 com um catálogo extenso de variantes? Atualize para a versão 9.1 para obter melhorias no desempenho do carrinho de compras.
8.0 Versão resumida
As combinações se multiplicam, e essa multiplicação impacta o banco de dados mais rápido do que a maioria dos comerciantes espera. Cinco tabelas por combinação. Um produto com quatro atributos e alguns milhares de variantes pode conter 30,000 linhas.
O problema de desempenho reside na página do produto, não no armazenamento. O PrestaShop carrega todas as combinações e calcula o preço de cada uma individualmente, em todas as visualizações, independentemente de o visitante abrir ou não o menu suspenso.
A solução mais eficaz continua sendo a mais simples. Menos grupos de atributos significam exponencialmente menos combinações, então faça a multiplicação antes de gerar qualquer coisa.
Obrigado pela leitura.
Se você tiver dúvidas ou precisar de ajuda com o desempenho ou a migração do seu site, nossos especialistas estão à disposição. Entre em contato com a equipe da Knowband pelo e-mail [email protected] hoje mesmo para obter plugins de e-commerce confiáveis e personalizados para as suas necessidades.

