Diferença entre website, loja e store view no Magento
A documentação da Adobe descreve a hierarquia em cascata. Global vale para a instalação inteira. Website é o nível das configurações de funcionalidade e pode ter domínio próprio. Loja (store) define a categoria raiz, ou seja, o menu e o catálogo que aparece. Store view é o nível do idioma e da tradução, e cada uma pode ter base URL própria. Um exemplo de estrutura:
Global (instalação inteira)
└── Website: sualoja.com.br
├── Loja: Varejo (categoria raiz Varejo)
│ ├── Store view: Português
│ └── Store view: Español
└── Loja: Atacado (categoria raiz Atacado)
└── Store view: PortuguêsEm Stores > Settings > Configuration, o admin mostra em letra pequena, abaixo do nome de cada campo, até onde ele desce. Quando você troca o seletor de escopo no topo da tela, aparece uma caixa ao lado do campo: Use Default no nível de website e Use Website no nível de store view. Marcada, ela diz que aquele nível herda o valor de cima. Desmarcada, o nível passa a ter valor próprio. Se o campo nem aparece quando você escolhe uma store view, é porque ele não aceita valor naquele nível.
Três configurações que decidem o que cada website pode ter
Catalog Price Scope
Fica em Stores > Configuration > Catalog > Catalog > Price, com o caminho catalog/price/scope, e só pode ser alterada no escopo padrão. Tem duas opções: Global ou Website. Quando vai para Website, o próprio Magento troca o escopo de todos os atributos de preço para website, e a moeda base pode ser diferente em cada website. Não existe a opção store view: no core, preço nunca desce abaixo de website.
Por mexer em todos os atributos de preço de uma vez, essa troca eu só faço depois de testar num ambiente de homologação.
Share Customer Accounts
Em Stores > Configuration > Customers > Customer Configuration > Account Sharing Options (customer/account_share/scope), também só no escopo padrão. Per Website, o valor de fábrica, prende a conta ao website onde ela foi criada. Global deixa o cliente entrar em qualquer website. A troca para Global é recusada, com mensagem de erro, se o mesmo e-mail já existir em mais de um website.
Moeda base e moeda de exibição
Em Stores > Configuration > General > Currency Setup, a Base Currency aceita valor por website, e o próprio campo do Catalog Price Scope avisa que é ele que define o escopo da moeda base. A Default Display Currency desce até store view, mas só muda a moeda mostrada: a cobrança continua na moeda base.
Dez pedidos comuns e o menor escopo em que cada um cabe sem código
Conferi os campos de configuração nos atributos showInDefault, showInWebsite e showInStore do system.xml do Magento 2.4.9, que é onde o core define até onde cada campo desce. Nome, descrição e preço por grupo de cliente não são campos de configuração: o escopo deles vem dos atributos de produto do catálogo.
| Pedido | Campo ou recurso | Menor escopo sem código | Abaixo disso |
|---|---|---|---|
| Preço diferente numa segunda loja com domínio próprio | Catalog Price Scope em Website | Website | Preço por store view: desenvolvimento |
| Preço de atacado para clientes do grupo atacado | Customer Group Price, em Advanced Pricing | Grupo de cliente, por website | Regra que grupo e faixa de quantidade não cobrem: módulo |
| Meio de pagamento só para um país | Payment from Specific Countries, nos métodos do core | Website | Só numa store view: o Enabled do método não aceita esse nível |
| E-mail de pedido em espanhol | New Order Confirmation Template e Locale | Store view | Não precisa descer |
| Frete grátis só numa loja | Free Shipping, campo Enabled | Website | Só numa loja do mesmo website: regra de carrinho também é por website |
| Pedido mínimo diferente | Minimum Order Amount | Website | Por store view: desenvolvimento |
| Cobrar em outra moeda | Base Currency | Website, com preço em Website | Só exibir outra moeda já vai até store view |
| Clientes separados entre lojas | Share Customer Accounts | Website | Separar lojas do mesmo website: não existe no core |
| Compra sem cadastro só numa store view | Allow Guest Checkout | Store view | Não precisa descer |
| Nome e descrição do produto traduzidos | Atributos name e description | Store view | Não precisa descer |
Repare no padrão: tudo que envolve dinheiro (preço, pagamento, frete, pedido mínimo) para no website. Tudo que envolve texto e idioma desce até store view. Loja com vários idiomas no mesmo website que quer preço ou pagamento diferente por idioma esbarra nesse limite.
Configuração só para uma store view: por que o esforço muda
Enquanto o pedido cabe no escopo do campo, o trabalho é trocar um valor no admin, testar e pronto. Quando ele desce abaixo, o programador Magento de backend precisa escolher entre caminhos que envolvem código:
- Campo de configuração novo com o escopo desejado, declarado num módulo, e código que leia esse campo no lugar do original.
- Plugin sobre o método do core que decide o comportamento, por exemplo a disponibilidade de um meio de pagamento, consultando a store view atual.
- Atributo ou regra própria, quando o valor mora no produto ou no cliente.
Preço é o caso mais caro. O índice de preços do Magento, a tabela catalog_product_index_price, é organizado por website e grupo de cliente, sem coluna de store view. Preço por idioma dentro do mesmo website briga com esse índice, com o carrinho e com a listagem de categoria ao mesmo tempo.
Tem ainda o custo que não aparece no código: cada store view afetada precisa ser homologada separadamente, e cada atualização futura do Magento precisa ser testada contra essa customização. Por isso não há número de horas aqui: a estimativa vem do dev, depois de confirmar o escopo do campo.
Como pedir ao dev uma mudança que vale só para uma loja
Junto com os dados da loja, escreva antes de mandar o pedido:
- Em qual website, loja e store view a mudança vale, com o código de cada um (aparece em Stores > All Stores, e o dev lista com
bin/magento store:website:listebin/magento store:list). - Qual é o comportamento atual em cada um deles.
- O que não pode mudar nos outros.
- Se clientes e carrinhos são compartilhados entre essas lojas.
E faça ao dev uma pergunta só: qual é o menor escopo desse campo no system.xml? Se a resposta cobre o seu pedido, peça configuração. Se não cobre, peça a descrição da solução e a lista do que será testado em cada store view antes do valor.
Perguntas frequentes
Dá para ter preço diferente por store view no Magento?
Não pelo core. O Catalog Price Scope só aceita Global ou Website, e os atributos de preço seguem essa escolha. Preço por idioma ou por store view dentro do mesmo website exige desenvolvimento e esbarra no índice de preços, que é organizado por website e grupo de cliente.
Posso pedir ao dev uma regra que vale só para uma loja?
Pode. Antes, confira o menor escopo do campo envolvido. Se ele aceita valor por website ou por store view, é configuração. Se não aceita, peça ao dev a descrição da solução, seja campo novo, plugin ou módulo, e o que será testado em cada store view.
Cliente cadastrado numa loja consegue entrar na outra?
Depende do Share Customer Accounts. Em Per Website, o padrão, a conta vale no website onde foi criada, incluindo as lojas e store views dele. Em Global, vale em todos. O Magento recusa a troca para Global se o mesmo e-mail já existir em mais de um website.
O que significa a caixa Use Website no admin do Magento?
Ela aparece quando você edita uma configuração no nível de store view. Marcada, a store view herda o valor definido para o website. Desmarcada, a store view passa a ter valor próprio. No nível de website, a caixa equivalente se chama Use Default e herda o valor padrão.
Fontes oficiais
- Site, store, and view scope (Adobe Experience League)
- Currency configuration (Adobe Experience League)
- Customer accounts (escopo das contas) (Adobe Experience League)
- Customer group price (Adobe Experience League)
- Magento_Catalog system.xml no 2.4.9 (Catalog Price Scope) (Magento no GitHub)
- Magento_Customer Share.php no 2.4.9 (Share Customer Accounts) (Magento no GitHub)