Magento 2: Hapus Kode Toko di URL hanya untuk toko default

9

Kami menjalankan magento 2 multistore dalam 2 bahasa di mana tampilan toko default adalah bahasa Jerman. Toko online juga tersedia dalam bahasa Prancis. Kode toko ditambahkan ke URL seperti berikut:

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

Ketika datang ke SEO kami memiliki masalah duplikat konten karena toko default tersedia dengan DAN tanpa kode toko di URL. Url berikut menunjukkan konten yang sama:

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

Sebenarnya kita memerlukan perilaku yang sama seperti di sini untuk magento 1: Magento menghapus kode toko "default" dari url

Adakah yang tahu cara memperbaiki masalah ini?

christoph
sumber

Jawaban:

5

Preferensi \Magento\Store\Model\Store, timpa fungsi yang dilindungi berikut.

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

dengan kode di bawah ini:

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

    }
    return $url;
}
Renk
sumber
Tidak bekerja dengan switcher toko (kode toko sudah ditangguhkan lagi)
George
gunakan plugin setelah fungsi publik isUseStoreInUrl, ini lebih baik daripada mengubah preferensi di, lebih aman upgrade, itu sebabnya itu ada
DWils
2

Anda dapat menonaktifkan kode toko melalui admin di jalur di bawah ini

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

Simpan cache Dinonaktifkan atau jalankan perintah upgrade / deploy / cache jika Anda tidak melihat perubahannya

Manoj Deswal
sumber
Kami tidak ingin menghapus kode toko dari URL sepenuhnya. Hanya untuk tampilan toko default (= de)
christoph
tolong bantu saya untuk mageno 2.3 multi situs web magento.stackexchange.com/q/256694/57334 @Manoj Deswal
zus
2
  1. Buat modul baru di Vendor / HideDefaultStoreCode

registrasi.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. Tambahkan opsi ke panel admin

dll / 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>

Nilai opsi default adalah 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. Tambahkan pembantu

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. Buat after-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 / 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;
    }
}

Plugin saya untuk menyembunyikan Kode Toko Default - https://github.com/alex-79/magento2-hide-default-store-code-from-url

Alexander Bobylev
sumber
ekstensi yang bagus, itu bekerja untuk saya. mencari berjam-jam.
Amy
0

saya memiliki masalah yang sama. Setelah penelitian di sini, saya punya solusi berdasarkan jawaban Renk. Di backend atur "tambah kode toko". Daripada membuat di.xml di jalur ekstensi Anda di bawah "Vendor / Module / etc / di.xml" untuk sebuah 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>

Setelah itu buat kelas plugin di bawah "Vendor / Module / plugin / RemoveDefaultStorePath.php" dengan fungsi follow sebagai "after" IsUseStoreInUrl untuk menimpa perilaku standar

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

Dan daripada mengkompilasi dan membersihkan cache.

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

Saya harap itu membantu seseorang - di lingkungan saya sekarang saya memiliki "default" store url tanpa tambahan "store_code" dan untuk multisite lainnya menyimpan kode preferd "en" / "fr" dll. Harap tidak: di bawah konfigurasi toko - jangan set kode toko ke url:

masukkan deskripsi gambar di sini

BergMedia
sumber