Magento 2:デフォルトのストアのURLのみでストアコードを削除する


9

デフォルトのストアビューがドイツ語である2つの言語でmagento 2マルチストアを実行します。オンラインショップはフランス語でもご利用いただけます。店舗コードは次のようにURLに追加されます。

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

SEOに関して言えば、デフォルトのストアは、ストアコードなしで、およびで使用できるため、コンテンツが重複するという問題がありますURL。次のURLは同じコンテンツを示しています。

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

実際、我々は、Magentoの1のために、ここでのように同じ動作を必要とする:のURLからMagentoの削除「デフォルト」の店舗コード

誰もがこの問題を修正する方法を知っていますか?

回答:


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

ストアスイッチャーで動作しません(ストアコードが再度追加されます)
George

パブリック関数isUseStoreInUrlの後にプラグインを使用します。これは、di設定を変更するよりも優れており、アップグレードの安全性が高いため、そこにあるのです
DWils

2

以下のパスで管理者を介して店舗コードを無効にすることができます

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

変更が表示されない場合は、キャッシュを無効にしておくか、upgrade / deploy / cacheコマンドを実行します


URLから店舗コードを完全に削除したくありません。デフォルトのストアビュー(= de)のみ
クリストフ2017

mageno 2.3マルチWebサイト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__
);

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. 管理パネルにオプションを追加する

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>

デフォルトのオプション値は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. ヘルパーを追加

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. アフタープラグインを作成する

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>

プラグイン/モデル/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

私は同じ問題を抱えています。ここで調査した後、レンクの答えに基づいた解決策があります。バックエンドで「店舗コードを追加」を設定します。プラグインの「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」の下にプラグインクラスを作成し、次の関数を「後」の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」のない「デフォルト」ストアのURLがあり、他のマルチサイトストアでは優先コード「en」/「fr」などがあります。ストア構成-ストアコードをurlに設定しないでください。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.