Guia de multi store e multi website no Magento 2
Uma instalação do Magento pode rodar várias lojas: marcas diferentes, uma loja B2B e uma B2C, ou uma marca em vários países e idiomas. A plataforma suporta isso por meio de uma hierarquia de escopos, e a maior parte da dor de longo prazo em projetos multi store vem de escolher o nível errado no começo. Mover uma store view para o seu próprio website depois significa mover customers, preços e pedidos, e isso não é uma mudança pequena.
Este guia explica o que cada nível controla, como escolher, como rotear domínios para o escopo certo com Nginx e como manter o setup no código para todos os ambientes baterem.
A hierarquia de escopos
O Magento tem quatro níveis:
- Global. A instalação inteira.
- Website. Agrupa stores que compartilham customers, preços e pedidos, conforme a configuração.
- Store, chamada de store group no código. Define a root category, então decide qual árvore de catálogo é exibida.
- Store view. A camada de idioma e apresentação: locale, tema, nomes e descrições de produto traduzidos, conteúdo CMS.
Toda instalação começa com um de cada: o Main Website com código base, a Main Website Store e a Default Store View com código default.
O que cada nível controla
| Configuração | Menor escopo |
|---|---|
| Contas de customer | Global ou website, conforme a configuração |
| Preços de produto | Global ou website, conforme a configuração |
| Moeda base | Global ou website, seguindo o escopo de preço |
| Métodos de pagamento e envio | Website na maioria das configurações |
| Inventário (stocks do MSI) | Website, por meio dos sales channels |
| Root category | Store |
| Locale, tema, moeda de exibição | Store view |
| Nomes, descrições e URL keys de produto | Store view |
Duas configurações definem a maior parte do comportamento. O compartilhamento de contas de customer, em Stores, Configuration, Customers, Customer Configuration, Account Sharing Options, decide se uma conta funciona em todos os websites ou só no website onde foi criada. O catalog price scope, em Catalog, Catalog, Price, decide se um produto tem um preço único em todo lugar ou um preço por website.
bin/magento config:set customer/account_share/scope 1
bin/magento config:set catalog/price/scope 1
Para o account sharing, 1 significa por website e 0 significa global. Para o price scope, 1 significa website e 0 significa global. Decida isso antes de a loja ter customers. Mudar o account sharing de global para por website falha se o mesmo endereço de e-mail existe em mais de um website.
Escolhendo o nível certo
Use uma store view quando
Só o idioma ou a apresentação muda. Uma loja em inglês e francês com os mesmos preços, estoque e customers é um website, uma store e duas store views. As traduções de nomes e descrições de produto são guardadas por store view.
Use uma store separada quando
Você precisa de uma árvore de catálogo diferente mas todo o resto é compartilhado. Duas marcas que compartilham customers e configurações de checkout mas mostram categorias diferentes podem ser duas stores sob um website, cada uma com a sua root category.
Use um website separado quando
Preços, moedas, customers, métodos de pagamento ou estoque diferem. Uma loja B2B com base de customers e condições de pagamento próprias, ou uma loja de país com moeda e armazém próprios, é um website. Na dúvida entre store e website para um negócio que pode se afastar, escolha website. Juntar depois é mais fácil do que separar.
Criando a estrutura
Crie websites, stores e store views no admin em Stores, Settings, All Stores. Os códigos são identificadores permanentes usados na configuração e no roteamento, então escolha códigos curtos em minúsculas como b2b ou fr. Crie primeiro a root category da nova store em Catalog, Categories, depois a selecione ao criar a store.
Para manter a estrutura no código, faça o dump para o app/etc/config.php:
bin/magento app:config:dump scopes
Isso grava os websites, groups e stores na seção scopes do config.php. Commite, e nos outros ambientes o bin/magento app:config:import (que o setup:upgrade também roda) cria os escopos que faltam. Os IDs das root categories são guardados por número, então as categorias precisam existir com os mesmos IDs em todo ambiente, o que normalmente é verdade quando os ambientes são copiados da produção. O arquivo é explicado no guia de env.php e config.php.
Roteando domínios com Nginx
O Magento decide qual escopo rodar a partir de duas variáveis de servidor: MAGE_RUN_CODE e MAGE_RUN_TYPE. O tipo é website ou store, e o código é o código do website ou da store view. Sem elas, o Magento roda o website padrão.
Com o Nginx, mapeie o nome do host para um código:
map $http_host $MAGE_RUN_CODE {
default base;
shop.example.com base;
b2b.example.com b2b;
shop.example.fr fr;
}
map $http_host $MAGE_RUN_TYPE {
default website;
shop.example.fr store;
}
Coloque os blocos map no contexto http, fora do bloco server. Depois passe as variáveis ao PHP no location que trata o PHP na config de exemplo do Magento:
fastcgi_param MAGE_RUN_CODE $MAGE_RUN_CODE;
fastcgi_param MAGE_RUN_TYPE $MAGE_RUN_TYPE;
Adicione cada domínio ao server_name e ao certificado TLS. Usar website como tipo e deixar a store view padrão do website responder é a opção mais simples. Use store quando um domínio único deve sempre carregar uma store view específica. Mais sobre o resto do bloco server no guia de configuração do Nginx.
Uma alternativa para idiomas num domínio só é usar store codes na URL, como example.com/fr/, pela configuração web/url/use_store. É simples de configurar, mas muda toda URL da loja, então decida antes do lançamento.
Base URLs e configuração por escopo
Cada website precisa das próprias base URLs, definidas no escopo de website:
bin/magento config:set --scope=websites --scope-code=b2b web/unsecure/base_url "https://b2b.example.com/"
bin/magento config:set --scope=websites --scope-code=b2b web/secure/base_url "https://b2b.example.com/"
bin/magento config:set --scope=stores --scope-code=fr general/locale/code fr_FR
Use o mesmo padrão para métodos de pagamento, envio, imposto e configurações de remetente de e-mail. No admin, o seletor de escopo no canto superior esquerdo da página de configuração mostra quais valores são sobrescritos onde. Um erro comum é definir um valor no escopo de store view durante um debug e esquecer, de modo que mudanças posteriores no padrão não têm efeito naquela view.
Inventário, indexação e SEO
Com MSI, cada stock é atribuído a um ou mais websites como sales channels, e cada stock combina uma ou mais sources. Um website de país pode então vender do seu próprio armazém. Veja o guia de sources e stocks do MSI.
Cada store view multiplica os dados indexados. URL rewrites, o índice de busca e os dados de produto são guardados por store view, e as linhas do índice de preços por website e customer group. Dez store views com um catálogo grande significam uma reindexação muito mais longa e uma tabela url_rewrite muito maior. Não crie store views de que você não precisa.
Para vários idiomas ou países, cada store view precisa de tags hreflang corretas apontando para suas alternativas. Isso está no guia de hreflang.
FAQ
Qual a diferença entre um website e uma store view no Magento 2?
Um website pode ter customers, preços, moeda, métodos de pagamento e estoque próprios. Uma store view só muda idioma e apresentação, como locale, tema e conteúdo traduzido.
Customers podem compartilhar uma conta entre websites do Magento?
Sim. Defina o compartilhamento de contas como global. Com a configuração por website, cada website tem suas próprias contas de customer.
Como o Magento sabe qual website carregar para um domínio?
Pelas variáveis de servidor MAGE_RUN_CODE e MAGE_RUN_TYPE, normalmente definidas no Nginx com um map sobre o nome do host. Sem elas, o website padrão é carregado.
Posso ter preços diferentes por store view?
Não. O menor escopo de preço é o website. Para preços diferentes no mesmo website, use customer groups, catalog price rules ou websites separados.
Atendo como freelancer em Magento e Adobe Commerce, incluindo configurações multi store e multi website. Se você precisa de ajuda com isso, fale comigo.
Artigos relacionados
env.php vs config.php no Magento 2 explicados
O que vai no app/etc/env.php e no config.php do Magento 2, como funciona a precedência de configuração, app:config:dump, --lock-env x --lock-config e segredos fora do Git.
Checklist de hardening de segurança do admin do Magento 2
Faça o hardening do admin do Magento 2: caminho custom, restrição por IP, 2FA, lockout e sessão, limpeza de usuários e roles, integrações de API e logs do admin.
Shipping method customizado no Magento 2: crie um módulo de carrier
Como criar um shipping method customizado no Magento 2.4: config.xml, system.xml, um carrier model com collectRates, regras de frete grátis e APIs externas de tarifa.
Checklist de limpeza de malware no Magento 2 para lojistas
Checklist defensivo para uma loja Magento 2 hackeada: sinais de comprometimento, achar código injetado em arquivos e banco, rebuild limpo, novas credenciais e hardening.