Magento 2:仅针对默认商店删除URL中的商店代码


9

我们在2种语言中运行magento 2多层商店,其中默认商店视图为德语。网上商店也有法语版本。商店代码将添加到以下URL:

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

当涉及到SEO时,我们会遇到内容重复的问题,因为默认存储区可以使用AND,而在中没有存储区代码URL。以下网址显示了相同的内容:

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

实际上,对于magento 1,我们需要像此处一样的行为:Magento从网址中删除“默认”商店代码

有人知道如何解决此问题吗?

Answers:


5

Preference \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首选项更好,更安全地升级,这就是为什么在
插件

2

您可以在以下路径通过管理员禁用商店代码

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

如果看不到更改,请禁用缓存或运行升级/部署/缓存命令


我们不想完全从URL中删除商店代码。仅用于默认商店视图(= de)
christoph

您能否帮助mageno 2.3多网站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. 添加助手

帮手/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>

插件/模型/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


很好的扩展,对我有用。寻找时间。
艾米(Amy)

0

我也有同样的问题。经过这里的研究,我有一个基于Renk答案的解决方案。在后端设置“添加商店代码”。在插件的“ Vendor / Module / etc / di.xml”下的扩展路径中创建一个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”下创建插件类,并将其跟随函数作为“ after” 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

我希望对您有所帮助-在我的环境中,我现在拥有“默认”存储网址,没有任何附加的“ store_code”,对于其他多站点,则存储首选代码“ en” /“ fr”等。请不要:商店配置-不要将商店代码设置为url:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.