Magento 2: eliminar el código de tienda en la URL solo para la tienda predeterminada

9

Ejecutamos un magento 2 multistore en 2 idiomas donde la vista predeterminada de la tienda es alemana. La tienda en línea también está disponible en francés. El código de la tienda se agrega a las URL como las siguientes:

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

Cuando se trata de SEO, tenemos el problema del contenido duplicado porque la tienda predeterminada está disponible con AND sin código de tienda URL. Las siguientes URL muestran el mismo contenido:

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

De hecho, necesitamos el mismo comportamiento que aquí para magento 1: Magento elimina el código de tienda "predeterminado" de las URL

¿Alguien sabe cómo solucionar este problema?

christoph
fuente

Respuestas:

5

Preferencia \Magento\Store\Model\Store, anule la siguiente función protegida.

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

con el siguiente código:

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

    }
    return $url;
}
Renk
fuente
No funciona con la tienda de conmutación (código de la tienda agrega como prefijo de nuevo)
George
use un complemento después de que la función pública seaUseStoreInUrl, es mejor que cambiar la preferencia de di, más actualización segura, es por eso que está allí
DWils
2

Puede deshabilitar los códigos de tienda a través del administrador en la siguiente ruta

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

Mantenga la memoria caché deshabilitada o ejecute los comandos actualizar / implementar / caché si no ve los cambios

Manoj Deswal
fuente
No queremos eliminar completamente los códigos de tienda de la URL. Solo para la vista de tienda predeterminada (= de)
christoph
¿pueden ayudarme por favor para el sitio web múltiple mageno 2.3 magento.stackexchange.com/q/256694/57334 @Manoj Deswal
zus
2
  1. Crear nuevo módulo en Vendor / HideDefaultStoreCode

registro.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. Agregar una opción al panel de administración

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>

El valor predeterminado de la opción es 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. Añadir ayudante

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. Crear un complemento posterior

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

Mi complemento para ocultar el código de tienda predeterminado : https://github.com/alex-79/magento2-hide-default-store-code-from-url

Alexander Bobylev
fuente
Gran extensión, funcionó para mí. buscando por horas.
Amy
0

Tengo el mismo problema. Después de investigar aquí, tengo una solución basada en la respuesta de Renk. En el backend establezca el "agregar código de tienda". Luego cree un di.xml en su ruta de extensión en "Proveedor / Módulo / etc / di.xml" para un complemento.

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

Después de eso, cree la clase de complemento en "Proveedor / Módulo / plugin / RemoveDefaultStorePath.php" con la siguiente función como "después" IsUseStoreInUrl para sobrescribir el comportamiento estándar

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

Y luego compilar y limpiar el caché.

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

Espero que eso ayude a alguien: en mi entorno, ahora tengo las URL de la tienda "predeterminadas" sin ningún "código_de_venta" adicional y para las otras tiendas multisitio almacena el código preferido "en" / "fr", etc. Por favor no: debajo la configuración de la tienda: no establezca el código de la tienda en url:

ingrese la descripción de la imagen aquí

BergMedia
fuente