Magento 2: Supprimer le code de magasin dans l'URL uniquement pour le magasin par défaut

9

Nous exécutons un magasin multento magento 2 en 2 langues où la vue par défaut du magasin est l'allemand. La boutique en ligne est également disponible en français. Le code du magasin est ajouté aux URL comme suit:

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

En ce qui concerne le référencement, nous avons le problème du contenu en double car le magasin par défaut est disponible avec AND sans code de magasin URL. Les URL suivantes affichent le même contenu:

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

En fait, nous avons besoin du même comportement qu'ici pour magento 1: Magento supprime le code de magasin "par défaut" des URL

Quelqu'un sait-il comment résoudre ce problème?

christoph
la source

Réponses:

5

Préférence \Magento\Store\Model\Store, remplacez la fonction protégée suivante.

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

avec le code ci-dessous:

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

    }
    return $url;
}
Renk
la source
Ne fonctionne pas avec le commutateur de magasin (le code du magasin est de nouveau suspendu)
George
utiliser un plugin après la fonction publique isUseStoreInUrl, c'est mieux que de changer la préférence di, plus de sécurité pour la mise à niveau, c'est pourquoi il est là
DWils
2

Vous pouvez désactiver les codes de magasin via l'administrateur au chemin ci-dessous

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

Gardez le cache désactivé ou exécutez les commandes de mise à niveau / déploiement / cache si vous ne voyez pas les modifications

Manoj Deswal
la source
Nous ne voulons pas supprimer complètement les codes de magasin de l'URL. Uniquement pour la vue par défaut du magasin (= de)
christoph
pouvez-vous m'aider pour le site Web mageno 2.3 multi magento.stackexchange.com/q/256694/57334 @Manoj Deswal
zus
2
  1. Créer un nouveau module dans 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. Ajouter une option au panneau d'administration

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>

La valeur par défaut de l'option est Non

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. Ajouter une aide

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. Créer un plugin après

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 / Modèle / 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;
    }
}

Mon plugin pour masquer le code de magasin par défaut - https://github.com/alex-79/magento2-hide-default-store-code-from-url

Alexander Bobylev
la source
grande extension, cela a fonctionné pour moi. chercher des heures.
Amy
0

J'ai le même problème. Après des recherches ici, j'ai une solution basée sur la réponse de Renk. Dans le backend, définissez le "add store code". Ensuite, créez un di.xml dans votre chemin d'extension sous "Vendor / Module / etc / di.xml" pour un plugin.

<?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>

Après cela, créez la classe de plug-in sous "Vendor / Module / plugin / RemoveDefaultStorePath.php" avec la fonction suivante "after" IsUseStoreInUrl pour remplacer le comportement standard

<?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;
          }
       }
    }
}

Et puis compilez et nettoyez le cache.

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

J'espère que cela aide quelqu'un - dans mon environnement, j'ai maintenant les URL de magasin "par défaut" sans aucun "store_code" supplémentaire et pour les autres multisites stocke le code préféré "en" / "fr" etc. Veuillez ne pas: sous la configuration du magasin - ne définissez pas le code du magasin sur url:

entrez la description de l'image ici

BergMedia
la source