Magento 2: rimuovi il codice negozio nell'URL solo per l'archivio predefinito


9

Eseguiamo un magento 2 multistore in 2 lingue in cui la visualizzazione predefinita del negozio è tedesca. Il negozio online è disponibile anche in francese. Il codice negozio viene aggiunto agli URL come il seguente:

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

Quando si tratta di SEO, abbiamo il problema dei contenuti duplicati perché l'archivio predefinito è disponibile con AND senza codice negozio URL. I seguenti URL mostrano lo stesso contenuto:

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

In effetti abbiamo bisogno dello stesso comportamento come qui per magento 1: Magento rimuove il codice negozio "predefinito" dagli URL

Qualcuno sa come risolvere questo problema?

Risposte:


5

Preferenza \Magento\Store\Model\Store, sovrascrivere la seguente funzione protetta.

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

con il codice seguente:

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

    }
    return $url;
}

Non funziona con il commutatore di negozi (codice del negozio ancora una volta in sospeso)
George

utilizzare un plug-in dopo che la funzione pubblica isUseStoreInUrl, è meglio che modificare la preferenza, un aggiornamento più sicuro, ecco perché è lì
DWils

2

Puoi disabilitare i codici negozio tramite admin nel percorso seguente

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

Mantieni cache disabilitata o esegui i comandi upgrade / deploy / cache se non vedi le modifiche


Non vogliamo rimuovere completamente i codici negozio dall'URL. Solo per visualizzazione negozio predefinita (= de)
christoph

mi potete aiutare per mageno 2.3 multi website magento.stackexchange.com/q/256694/57334 @Manoj Deswal
zus

2
  1. Crea un nuovo modulo in 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. Aggiungi un'opzione al pannello di amministrazione

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>

Il valore dell'opzione predefinita è No

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. Aggiungi aiuto

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. Crea post-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 / Modello / 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;
    }
}

My Plugin for hide Codice negozio predefinito - https://github.com/alex-79/magento2-hide-default-store-code-from-url


grande estensione, ha funzionato per me. cercando per ore.
Amy,

0

Ho lo stesso problema. Dopo le ricerche qui, ho una soluzione basata sulla risposta di Renk. Nel backend imposta "aggiungi codice negozio". Quindi crea un di.xml nel tuo percorso di estensione in "Fornitore / Modulo / etc / di.xml" per 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>

Successivamente, crea la classe del plugin in "Fornitore / Modulo / plugin / RemoveDefaultStorePath.php" con la seguente funzione come "dopo" IsUseStoreInUrl per sovrascrivere il comportamento 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;
          }
       }
    }
}

E poi compilare e pulire la cache.

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

Spero che sia d'aiuto a qualcuno - nel mio ambiente ora ho l'URL dello store "predefinito" senza alcun "store_code" aggiuntivo e per gli altri siti multipli memorizza il codice preferito "en" / "fr" ecc. Per favore: sotto la configurazione del negozio - non impostare il codice del negozio su url:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.