Por padrão, URL Key
na página do produto, o escopo é Global.
EDIT: Como sugerido por FlorinelChis, o escopo pode ser alterado em Gerenciar atributos. No entanto, isso interrompe o comportamento do comutador de exibição da loja.
Isso foi testado no 1.7.0.2 com dados de amostra e "Adicionar código de loja ao URL" ativado :
- editar um produto e definir um URL diferente para uma determinada visualização de loja (francês)
- Re-indexar
- Abrir página do produto no site na visualização da loja em inglês
- Mudar para francês: você terá o URL da página
/French/
Voltar para inglês -> erro de página 404 (o URL perde o código da loja
/default/
como fazê-lo funcionar corretamente com a visualização da loja / opção de idioma?
Detalhes:
- URL para inglês:
/default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
- URL para francês:
/french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
Se eu estiver no site em inglês desta página -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
Então eu mudo para o francês:
Eu recebi este URL ( o código da loja está ausente ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html
Então, o magento reescreve o URL corretamente, mas perde o código da loja por algum motivo
Referência:
Com certeza isto está relacionado com /core/model/store.php
e /core/model/url/rewrite.php
, e em particular a esses métodos:
Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl
ATUALIZAR
Se você estiver no 1.9.1, a correção @Vinai não funcionará, verifique a nova resposta que adicionei
Respostas:
O problema é um bug no modelo
Mage_Core_Model_Url_Rewrite_Request
(Magento 1.8) eMage_Core_Model_Url_Rewrite
(versões anteriores).A seção do código principal no 1.8 é assim:
A Bug: o valor do parâmetro de consulta é o código da loja, (no meu caso
de
,en
oufr
). As chaves da matriz retornada porapp->getStores()
são os IDs numéricos da loja. É por isso queif (!empty($stores[$fromStore])) {
sempre falha.Depois que esse bug é corrigido, outro bug se torna aparente posteriormente no mesmo método (acho que apenas no 1.8):
A URL de base dos objetos de solicitação sempre é o Magento base_url, sem o código da loja. Usando, em
$currentStore->getBaseUrl()
vez disso, corrige esse bug também.Uma vez resolvidos esses dois problemas, o alternador de idiomas funciona bem. Aqui está uma extensão que faz exatamente isso no Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites
No Magento 1.7, o problema pode ser algo diferente. Eu ainda pensei em adicionar essa resposta, caso o google traga alguém aqui que esteja executando a versão 1.8 ou mais recente.
fonte
Na verdade, encontrei uma solução alternativa para esse problema no Magento 1.7.0.2 se você estiver executando o Magento 1.8, veja a explicação detalhada de Vinai:
Parece que parte do problema está relacionada ao controlador de solicitação
Mage_Core_Controller_Request_Http
.Se você observar a linha 161, existe esta condição:
Comentar corrige o erro 404 quando mudo para uma loja diferente em uma categoria / página de produto.
No entanto, por algum motivo desconhecido, algum tempo o código de loja está ausente na URL de resposta, mas isso não está causando mais problemas, pois as duas URLs funcionam agora:
Ainda não está claro para mim se o comentário dessa condição pode causar outro problema
fonte
Mage_Core_Controller_Request_Http
não pode ser reescrito em um módulo.Algumas informações atualizadas do Magento 1.9.1
O bug que @Vinai apontou parece resolvido nesta versão de qualquer maneira por outro motivo: a funcionalidade ainda está com problemas (para produtos configuráveis)
O problema do problema real provavelmente está aqui,
Mage_Catalog_Model_Resource_Url
mas não tenho tempo e não quero tocar em uma parte tão delicada do núcleo.Explicação para uma solução alternativa:
O ponto de entrada é sempre essa classe
Mage_Core_Model_Url_Rewrite_Request
e, em particular, o método_rewriteDb()
Como
_rewriteDb()
funciona:(139):
$this->_rewrite->loadByRequestPath($requestCases);
___from_store
parâmetro(142):
if (!$this->_rewrite->getId() && $fromStore) {
___from_store
:(152):
$this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
id_path
para carregar o da loja atual:(159):
$this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());
Tudo parece bom, no entanto, há um problema nos dados url_rewrite e, portanto, com a funcionalidade de índice (pelo menos para produtos configuráveis):
O problema é que essa reescrita aponta para o errado
id_path
(em vez de apontar para o ID do produto configurável, está apontando para um dos seus IDs simples)Agora, uma solução alternativa é remover a
!$this->_rewrite->getId()
condição e, assim, o magento tenta encontrar um redirecionamento sempre que houver um$fromstore
parâmetrocatalog_url
índice e remover a reescrita incorreta criada.Aqui está o código para a solução rápida (você precisará criar um módulo e reescrever a
Mage_Core_Model_Url_Rewrite_Request
classe por conta própria):fonte
Chave do URL é um atributo. Você pode editá-lo em: Catálogo -> Atributos -> Gerenciar atributos . Pesquise url_key e clique nele.
Mude o escopo e salve.
Agora você pode ter diferentes chaves de URL para produtos em cada visualização da loja.
fonte
Deseja alterar o URL de cada visualização da loja?
No momento, você modificou o URL do produto no escopo de pontuação da sua loja francesa para ser diferente da sua loja em inglês? E quando você alterna entre os dois, obtém um 404. Esse seria o comportamento esperado.
O Magento não armazena diferentes regravações de URL para outras visualizações da loja. Então, quando você bate
/french/product1
na loja francesa, o URL corresponderá na tabela e será carregado. Mas quando você acessa a loja em inglês, não haverá correspondência e, portanto, 404.Parece que você precisa apenas "Adicionar códigos de loja ao URL" - o que deixará suas chaves de URL em paz, mas prefixará todos os respectivos URLs com o código da loja. Isso deve permitir que o alternador da sua loja funcione.
fonte