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/

zed Blackbeard
fuente
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);
Raphael en Digital Pianism
fuente
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;
    }
}
Hervé Guétin
fuente
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

CDzWebDev
fuente