Magento 2: Entfernen Sie den Geschäftscode in der URL nur für den Standardspeicher

9

Wir führen einen Magento 2-Multistore in 2 Sprachen aus, wobei die Standardspeicheransicht Deutsch ist. Online-Shop ist auch in Französisch verfügbar. Speichercode wird URLs wie den folgenden hinzugefügt:

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

Wenn es um SEO geht, haben wir das Problem, dass Inhalte doppelt vorhanden sind, da der Standardspeicher mit UND ohne Speichercode verfügbar ist URL. Die folgenden URLs zeigen den gleichen Inhalt:

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

Tatsächlich benötigen wir dasselbe Verhalten wie hier für Magento 1: Magento entfernt "Standard" -Speichercode aus URLs

Weiß jemand, wie man dieses Problem behebt?

Christoph
quelle

Antworten:

5

Bevorzugt \Magento\Store\Model\Store, überschreiben Sie die folgende geschützte Funktion.

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

mit folgendem Code:

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

    }
    return $url;
}
Renk
quelle
Funktioniert nicht mit Store Switcher (Store Code erneut vorangestellt)
George
Verwenden Sie ein Plugin nach der öffentlichen Funktion isUseStoreInUrl, es ist besser als die di-Präferenz zu ändern, mehr Upgrade sicher, deshalb ist es da
DWils
2

Sie können die Geschäftscodes über den Administrator unter dem folgenden Pfad deaktivieren

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

Cache deaktivieren oder Upgrade / Deployment / Cache-Befehle ausführen, wenn die Änderungen nicht angezeigt werden

Manoj Deswal
quelle
Wir möchten die Geschäftscodes nicht vollständig aus der URL entfernen. Nur für Standard Store View (= de)
Christoph
Können Sie mir bitte helfen für mageno 2.3 Multi-Website magento.stackexchange.com/q/256694/57334 @Manoj Deswal
zus
2
  1. Erstellen Sie ein neues Modul in Vendor / HideDefaultStoreCode

register.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. Fügen Sie dem Admin-Bereich eine Option hinzu

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>

Der Standardoptionswert ist Nein

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. Helfer hinzufügen

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. After-Plugin erstellen

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

Mein Plugin zum Ausblenden des Standardspeichercodes - https://github.com/alex-79/magento2-hide-default-store-code-from-url

Alexander Bobylev
quelle
tolle Erweiterung, es hat bei mir funktioniert. stundenlang suchen.
Amy
0

Ich habe das gleiche Problem. Nach Recherchen hier habe ich eine Lösung basierend auf Rennens Antwort. Stellen Sie im Backend den "Store Code hinzufügen" ein. Dann erstellen Sie eine di.xml in Ihrem Erweiterungspfad unter "Vendor / Module / etc / di.xml" für ein 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>

Erstellen Sie anschließend die Plugin-Klasse unter "Vendor / Module / plugin / RemoveDefaultStorePath.php" mit der folgenden Funktion "after" IsUseStoreInUrl, um das Standardverhalten zu überschreiben

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

Und dann kompilieren und bereinigen Sie den Cache.

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

Ich hoffe das hilft jemandem - in meiner Umgebung habe ich jetzt die "Standard" Store URLs ohne zusätzlichen "Store_code" und für die anderen Multisites den bevorzugten Code "en" / "fr" usw. Bitte nicht: unter Die Store-Konfiguration - Setzen Sie den Store-Code nicht auf URL:

Geben Sie hier die Bildbeschreibung ein

BergMedia
quelle