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ês

Em 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.

PedidoCampo ou recursoMenor escopo sem códigoAbaixo disso
Preço diferente numa segunda loja com domínio próprioCatalog Price Scope em WebsiteWebsitePreço por store view: desenvolvimento
Preço de atacado para clientes do grupo atacadoCustomer Group Price, em Advanced PricingGrupo de cliente, por websiteRegra que grupo e faixa de quantidade não cobrem: módulo
Meio de pagamento só para um paísPayment from Specific Countries, nos métodos do coreWebsiteSó numa store view: o Enabled do método não aceita esse nível
E-mail de pedido em espanholNew Order Confirmation Template e LocaleStore viewNão precisa descer
Frete grátis só numa lojaFree Shipping, campo EnabledWebsiteSó numa loja do mesmo website: regra de carrinho também é por website
Pedido mínimo diferenteMinimum Order AmountWebsitePor store view: desenvolvimento
Cobrar em outra moedaBase CurrencyWebsite, com preço em WebsiteSó exibir outra moeda já vai até store view
Clientes separados entre lojasShare Customer AccountsWebsiteSeparar lojas do mesmo website: não existe no core
Compra sem cadastro só numa store viewAllow Guest CheckoutStore viewNão precisa descer
Nome e descrição do produto traduzidosAtributos name e descriptionStore viewNã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:

  1. 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:list e bin/magento store:list).
  2. Qual é o comportamento atual em cada um deles.
  3. O que não pode mudar nos outros.
  4. 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

  1. Site, store, and view scope (Adobe Experience League)
  2. Currency configuration (Adobe Experience League)
  3. Customer accounts (escopo das contas) (Adobe Experience League)
  4. Customer group price (Adobe Experience League)
  5. Magento_Catalog system.xml no 2.4.9 (Catalog Price Scope) (Magento no GitHub)
  6. Magento_Customer Share.php no 2.4.9 (Share Customer Accounts) (Magento no GitHub)

Outros artigos

Ver todos os artigos

Precisa de um orçamento? Ficarei feliz em ajudar. Clique aqui