Magento 2: reescrever o URL do produto

15

Eu estou tentando obter rewrite product urla partir do load productmódulo personalizado. Estou recebendo o URL no http://localhost/m2/catalog/product/view/id/1401/category/23/formato.

Mas eu quero http://localhost/m2/juno-jacket.html

Aqui está o código

no construtor

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

Função personalizada

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

abc() method retornar url como http://localhost/m2/catalog/product/view/id/1401/category/23/

zed Barba Negra
fonte
reconstrua seus índices
Marius
@ Marius: eu tenho reconstruído também. Ele não está retornando o URL de reescrita do produto.
precisa
o seu produto está associado a algum site?
Marius
Tenho atribuído produto no site principal
zed Blackbeard
getProductUrl()deve retornar o URL reescrito se a entrada existir em url_rewrite. Você excluiu registros desta tabela manualmente?
17136 musicliftsme

Respostas:

4

Aqui está o método que eu usei para obter o URL do produto.

Definitivamente, não é o ideal, pois preciso carregar o produto inteiro para obter um desempenho tão ruim em termos de desempenho.

Primeiro você precisa injetar um Magento\Catalog\Model\ProductRepositoryno seu construtor:

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

Em seguida, você carrega o produto com base no ID do produto:

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

Finalmente, você pode obter o modelo de URL para recuperar o URL reescrito:

return $product->getUrlModel()->getUrl($product);
Raphael na Digital Pianism
fonte
A vírgula dupla no final não se destina, não é?
Max
@ Max
5
Estou enfrentando o mesmo e tentei seu código, mas os URLs ainda estão incorretos para mim. Por favor informar.
Anshu Mishra
Outra maneira (e menos perf-killer) pode ser forçar a adição de reescritas de URL na carga da coleção de produtos. Veja minha resposta.
Hervé Guétin
mesmo erro, você pode me dizer onde posso colocar esse código?
Rahul Katoch
3

Isso pode realmente não responder à pergunta, mas as chances são de que, se estiver faltando a reescrita do URL, você poderá obter seu produto de uma coleção de produtos. E adicionar informações de reescrita de URL não é automático, como você pode ver \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite.

A maneira como eu consegui forçar a adição de reescritas de URL é criando um plugin no create()método de \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory. E logo que o seu código (ou código do núcleo do Magento) usa essa fábrica para instanciating uma coleção de produtos (e que deveria como das melhores práticas), este forças de plug-in do \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewritepara true.

Em seguida, as reescritas de URL dos produtos são adicionadas com êxito aos produtos sem a necessidade de fazer um loop neles e recarregá-los. Assim, corrige a desvantagem que o @Raphael falou.

Aqui está a definição XML do plug-in (no seu di.xmlarquivo):

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

E o código do plugin:

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
fonte
Eu tentei dessa maneira, mas a classe de plug-in não está sendo executada. Você sabe por quê?
Deeps
0

Exporte seus produtos para um arquivo csv

do arquivo csv no Excel use esta fórmula para a coluna url_key

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

onde "P103" é a coluna url_key

CDzWebDev
fonte