Magento 2: Remova o código da loja no URL apenas para a loja padrão

9

Executamos um magento 2 multistore em 2 idiomas, onde a visualização padrão da loja é alemã. A loja online também está disponível em francês. O código da loja é adicionado aos URLs como o seguinte:

www.domain.at
www.domain.at/de
www.domain.at/fr

Quando se trata de SEO, temos o problema de conteúdo duplicado porque a loja padrão está disponível com AND sem código de loja URL. Os seguintes URLs mostram o mesmo conteúdo:

www.domain.at/de  
www.domain.at/

De fato, precisamos do mesmo comportamento aqui do magento 1: Magento remove o código de loja "padrão" dos URLs

alguém sabe como resolver esse problema?

Christoph
fonte

Respostas:

5

Preferências \Magento\Store\Model\Store, substitua a seguinte função protegida.

protected function _updatePathUseStoreView($url)
{
    if ($this->isUseStoreInUrl()) {
        $url .= $this->getCode() . '/';
    }
    return $url;
}

com o código abaixo:

protected function _updatePathUseStoreView($url)
{
    if ($this->isUseStoreInUrl()) {
        if($this->getCode() == 'default'){
            $url .= '/';
        }else{
            $url .= $this->getCode() . '/';
        }

    }
    return $url;
}
Renk
fonte
Não funciona com o alternador de lojas (código de loja pendente novamente)
George
usar um plug-in após o isUseStoreInUrl função pública, é melhor do que mudar o di preferência, mais atualização de segurança, é por isso que a sua existência
DWils
2

Você pode desativar os códigos de loja via admin no caminho abaixo

Admin > Stores > Configuration > General > Web > URL options > Add Store Code to Urls > No

Manter cache desativado ou executar comandos upgrade / deploy / cache se você não vir as alterações

Manoj Deswal
fonte
Não queremos remover totalmente os códigos de loja do URL. Somente para visualização padrão da loja (= de) #
christoph
você pode pls me ajudar para mageno 2.3 multi site magento.stackexchange.com/q/256694/57334 @ Manoj Deswal
zus
2
  1. Crie um novo módulo no Vendor / HideDefaultStoreCode

registration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_HideDefaultStoreCode',
    __DIR__
);

etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Vendor_HideDefaultStoreCode" setup_version="0.1.0" />
</config>
  1. Adicione uma opção ao painel de administração

etc / adminhtml / system.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
    <system>
        <section id="web">
            <group id="url">
                <field id="hide_default_store_code" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="1" canRestore="1">
                    <label>Hide Default Store Code</label>
                    <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
                </field>
            </group>
        </section>
    </system>
</config>

O valor padrão da opção é Não

etc / config.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
    <default>
        <web>
            <url>
                <hide_default_store_code>0</hide_default_store_code>
            </url>
        </web>
    </default>
</config>
  1. Adicionar ajudante

Helper / Data.php

<?php
namespace Vendor\HideDefaultStoreCode\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    const XML_PATH_HIDE_DEFAULT_STORE_CODE = 'web/url/hide_default_store_code';

    /**
     *
     * @var \Magento\Framework\App\Config\ScopeConfigInterface
     */
    protected $scopeConfig;

    /**
     *
     * @param \Magento\Framework\App\Helper\Context $context
     * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
     */
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
    ) {
        parent::__construct($context);
        $this->scopeConfig = $scopeConfig;
    }

    /**
     *
     * @return boolean
     */
    public function isHideDefaultStoreCode()
    {
        if ($this->scopeConfig->getValue(self::XML_PATH_HIDE_DEFAULT_STORE_CODE, \Magento\Store\Model\ScopeInterface::SCOPE_STORE)) {
            return true;
        }
        return false;
    }
}
  1. Criar pós-plugin

etc / di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Store\Model\Store">
        <plugin name="vendor_hide_default_store_code" type="\Vendor\HideDefaultStoreCode\Plugin\Model\HideDefaultStoreCode" sortOrder="0" />
    </type>
</config>

Plugin / Model / HideDefaultStoreCode.php

<?php

namespace Vendor\HideDefaultStoreCode\Plugin\Model;

class HideDefaultStoreCode
{
    /**
     *
     * @var \Vendor\HideDefaultStoreCode\Helper\Data 
     */
    protected $helper;

    /**
     *
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $storeManager;

    /**
     * 
     * @param \Vendor\HideDefaultStoreCode\Helper\Data $helper
     * @param \Magento\Store\Model\StoreManagerInterface $storeManager
     */
    public function __construct(
        \Vendor\HideDefaultStoreCode\Helper\Data $helper,
        \Magento\Store\Model\StoreManagerInterface $storeManager
    ){
        $this->helper = $helper;
        $this->storeManager = $storeManager;
    }

    /**
     * 
     * @param \Magento\Store\Model\Store $subject
     * @param string $url
     * @return string
     */
    public function afterGetBaseUrl(\Magento\Store\Model\Store $subject, $url)
    {
        if ($this->helper->isHideDefaultStoreCode()) {
            $url = str_replace('/'.$this->storeManager->getDefaultStoreView()->getCode().'/','/', $url);
        }
        return $url;
    }
}

Meu plug-in para ocultar o código padrão da loja - https://github.com/alex-79/magento2-hide-default-store-code-from-url

Alexander Bobylev
fonte
grande extensão, funcionou para mim. procurando por horas.
Amy
0

Eu tenho o mesmo problema. Após a pesquisa aqui, eu tenho uma solução baseada na resposta da Renk. No back-end, defina o "adicionar código da loja". Em seguida, crie um di.xml no caminho da sua extensão em "Fornecedor / Módulo / etc / di.xml" para um plug-in.

<?xml version="1.0"?>
   <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
        <type name="\Magento\Store\Model\Store">
            <plugin name="RemoveDefaultStorePath" type="Vendor\Module\Plugin\RemoveDefaultStorePath" sortOrder="1" disabled="false" />
        </type>
    </config>

Depois disso, crie a classe de plug-in em "Fornecedor / Módulo / plugin / RemoveDefaultStorePath.php" com a função follow como "after" IsUseStoreInUrl para substituir o comportamento padrão

<?php

namespace Vendor\Module\Plugin;


class RemoveDefaultStorePath
{
    public function afterIsUseStoreInUrl(\Magento\Store\Model\Store $subject, $resultIsUseInUrl)
    {
       if ($subject->getCode()==='default')
        {
          $resultIsUseInUrl = false;
          return $resultIsUseInUrl && 'default';
        }
        else
        {
          $resultIsUseInUrl = true;
          if(!$subject->getCode() ==='admin') {
            return $resultIsUseInUrl && $subject->getCode() . '/';
          } else {
            $resultIsUseInUrl = false;
            return $resultIsUseInUrl && $subject::ADMIN_CODE;
          }
       }
    }
}

E do que compilar e limpar o cache.

php bin/magento setup:di:compile
php bin/magento cache:clean

Espero que ajude alguém - no meu ambiente, agora tenho os URLs "padrão" da loja sem nenhum código adicional "store_code" e, para os outros multisites, armazena o código preferido "en" / "fr" etc. Por favor, não: em a configuração da loja - não defina o código da loja como url:

insira a descrição da imagem aqui

BergMedia
fonte