Magento 2: obtener reescribir la URL del producto


15

Estoy tratando de obtener rewrite product urldesde el load productmódulo personalizado. Estoy obteniendo url en http://localhost/m2/catalog/product/view/id/1401/category/23/formato.

Pero yo quiero http://localhost/m2/juno-jacket.html

Aqui esta el codigo

en constructor

public function __construct(
    \Magento\Catalog\Helper\Product $catalogProductHelper,
) {
    $this->catalogProductHelper = $catalogProductHelper;
}

Función personalizada

public function abc(){
    $product_id = '123';
    return  $this->catalogProductHelper->getProductUrl($product_id);
}

abc() method URL de retorno como http://localhost/m2/catalog/product/view/id/1401/category/23/


reconstruya sus índices
Marius

@ Mario: yo también he reconstruido. No devuelve URL de reescritura del producto.
zed Blackbeard

¿Está su producto asociado a algún sitio web?
Marius

He asignado el producto en el sitio web principal
zed Blackbeard

getProductUrl()se supone que devuelve la URL reescrita si la entrada existe en url_rewrite. ¿Eliminó registros de esta tabla manualmente?
musicliftsme

Respuestas:


4

Aquí está el método que utilicé para obtener la URL del producto.

Definitivamente no es óptimo ya que tengo que cargar todo el producto para que sea tan malo en términos de rendimiento.

Primero necesitas inyectar un Magento\Catalog\Model\ProductRepositoryen tu constructor:

use Magento\Catalog\Model\ProductRepository;
//...
public function __construct(
    ProductRepository $productRepository
) {
    $this->_productRepository = $productRepository;
}

Luego carga el producto según la identificación del producto:

$product = $this->_productRepository->getById($productId);

Finalmente, puede obtener el modelo de URL para recuperar la URL reescrita:

return $product->getUrlModel()->getUrl($product);

La doble coma al final no está destinada, ¿no?
Max

@Max, sí, lo eliminé
Raphael en Digital Pianism

55
Estoy enfrentando lo mismo y he probado su código, pero aún así las URL son incorrectas para mí. Por favor avise.
Anshu Mishra

Otra forma (y menos eficaz) puede ser forzar la adición de reescrituras de URL en la carga de la colección de productos. Mira mi respuesta.
Hervé Guétin

mismo error, ¿podría decirme dónde puedo poner este código?
Rahul Katoch

3

Es posible que esto realmente no responda a la pregunta, pero es probable que, si falta la reescritura de URL, es posible que obtenga su producto de una colección de productos. Y agregar información de reescritura de URL no es automático como puede ver en \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite.

La forma en que logré forzar la adición de reescrituras de URL es mediante la creación de un complemento en el create()método de \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory. Y tan pronto como su código (o el código central de Magento) use esta fábrica para crear una instancia de una colección de productos (y debería hacerlo a partir de las mejores prácticas), este complemento obliga a \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewritehacerlo true.

Luego, las reescrituras de URL de productos se agregan con éxito a los productos sin la necesidad de hacer un bucle en ellas y volver a cargarlas. Por lo tanto, corrige la desventaja de la que habló @Raphael.

Aquí está la definición XML del complemento (en su di.xmlarchivo):

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Catalog\Model\ResourceModel\Product\CollectionFactory">
        <plugin name="your_plugin_unique_nane" type="Your\Plugin\Namespace\Plugin" />
    </type>
</config>

Y el código del complemento:

namespace Your\Plugin\Namespace;

use Magento\Catalog\Model\ResourceModel\Product\Collection;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as CoreCollectionFactory;

class Plugin
{
    /**
     * @param CoreCollectionFactory $subject
     * @param Collection $collection
     * @return Collection
     */
    public function afterCreate(CoreCollectionFactory $subject, Collection $collection)
    {
        $collection->addUrlRewrite();

        return $collection;
    }
}

Lo intenté de esta manera, pero la clase de complemento no se está ejecutando. ¿Sabes por qué?
Profundidades

0

Exporte sus productos a un archivo csv

desde el archivo csv en Excel use esta fórmula para la columna url_key

= "https://www.yourdomain.com/" & P103 & ".html"

donde "P103" es la columna url_key

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.