Magento 2: удалить код магазина в URL только для магазина по умолчанию

9

Мы запускаем мультимагазин magento 2 в 2-х языках, где по умолчанию вид магазина - немецкий. Интернет-магазин также доступен на французском языке. Код магазина добавляется к URL-адресам следующим образом:

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

Когда речь заходит о SEO, у нас возникает проблема дублирования контента, потому что магазин по умолчанию доступен с AND без кода магазина в URL. Следующие URL показывают одинаковое содержание:

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

На самом деле нам нужно такое же поведение, как здесь для magento 1: Magento удаляет код магазина по умолчанию из URL

Кто-нибудь знает, как решить эту проблему?

Christoph
источник

Ответы:

5

Предпочтение \Magento\Store\Model\Store, переопределите следующую защищенную функцию.

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

с кодом ниже:

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

    }
    return $url;
}
Ренк
источник
Не работает с переключателем магазина (снова сохранен код магазина)
Джордж
использовать плагин после публичной функции isUseStoreInUrl, это лучше, чем изменение предпочтения di, более безопасное обновление, вот почему он есть
DWils
2

Вы можете отключить коды магазина через админ по нижеуказанному пути

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

Keep cache Disabled или выполните команды upgrade / deploy / cache, если вы не видите изменений

Манодж Десвал
источник
Мы не хотим полностью удалять коды магазинов из URL. Только для просмотра хранилища по умолчанию (= де)
Christoph
Можете ли вы помочь мне для mageno 2.3 multi-сайт magento.stackexchange.com/q/256694/57334 @Manoj Deswal
Zus
2
  1. Создать новый модуль в Vendor / HideDefaultStoreCode

registration.php

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

и т.д. / 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. Добавить опцию в админку

и т.д. / 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>

Значение по умолчанию: Нет

и т.д. / 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. Добавить помощника

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. Создать после-плагин

и т.д. / 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>

Плагин / 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;
    }
}

Мой плагин для скрытия кода магазина по умолчанию - https://github.com/alex-79/magento2-hide-default-store-code-from-url

Александр Бобылев
источник
отличное продолжение, у меня это сработало. ищу часы.
Эми
0

У меня такая же проблема. После исследования здесь у меня есть решение, основанное на ответе Ренка. В бэкэнде установите «добавить код магазина». Затем создайте файл di.xml в пути расширения в разделе «Vendor / Module / 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="RemoveDefaultStorePath" type="Vendor\Module\Plugin\RemoveDefaultStorePath" sortOrder="1" disabled="false" />
        </type>
    </config>

После этого создайте класс плагина в «Vendor / Module / plugin / RemoveDefaultStorePath.php» с последующей функцией «после» IsUseStoreInUrl для перезаписи стандартного поведения

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

А потом скомпилировать и почистить кеш.

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

Я надеюсь, что это кому-нибудь поможет - в моем окружении у меня теперь есть URL-адреса магазинов «по умолчанию» без какого-либо дополнительного «store_code», а для других мультисайтовых магазинов предпочтительный код «en» / «fr» и т. Д. Пожалуйста, не: under Конфигурация магазина - не устанавливайте код магазина в URL:

введите описание изображения здесь

BergMedia
источник