No Magento 2, descobrimos um grande problema com as reescritas de URL.
Todos os produtos são importados por um script de importação. Também todas as categorias são criadas por este script. O problema: todas as reescritas de url de produto não são criadas automaticamente. Eles são criados apenas salvando cada categoria, uma por uma.
Neste Post irei mostrar como fazer isso automaticamente
O Magento 1 tinha um indexador que regenera o url e reescreve automaticamente cada execução desse indexador. Isso foi bastante confortável. O único problema eram as lojas com muitos produtos. Quanto mais produtos e mais reescritas, mais tempo esse indexador é executado. Então, para otimização de desempenho, foi uma boa idéia remover esse indexador do Magento 2. Mas isso tem outras desvantagens…
Problema
Uma reescrita de url é necessária para URLs de loja otimizados para seo. Normalmente, um deeplink para um produto se parece com isso:
http://domain.com/catalog/product/view/id/11431/s/10546560/category/792/
Como você pode ver, não é uma boa ideia, porque os números não são utilizáveis para uma máquina de busca. A melhor solução de SEO é nomear um URL por nome de categoria e nome do produto. Depois que você regenar o URL, o mesmo link será exibido da seguinte maneira:
http://domain.com/fruits/banana
O Magento 2 não cria automaticamente reescritas. Eles são computados apenas se você fizer uma ação como salvar categoria. Isso faz sentido se você criar categorias e produtos em seu back-end. Se você importar essas coisas por código, precisará salvar todas as categorias manualmente após cada importação. Nenhuma solução para um programador…
Solução
Uma solução bastante simples é usar um módulo Magento 2 pronto para executar, que faz exatamente o trabalho de um indexador de reescrita. Um programador fez isso e oferece seu módulo magento2-regenurl no github. Você pode chamar essa regeneração por código ou a partir da linha de comando. Uma solução melhor é fazer isso por código em seu próprio módulo importador. A regeneração é bem simples:
foreach($list as $product) { if($store_id === Store::DEFAULT_STORE_ID) $product->setStoreId($store_id); $this->urlPersist->deleteByData([ UrlRewrite::ENTITY_ID => $product->getId(), UrlRewrite::ENTITY_TYPE => ProductUrlRewriteGenerator::ENTITY_TYPE, UrlRewrite::REDIRECT_TYPE => 0, UrlRewrite::STORE_ID => $store_id ]); try { $this->urlPersist->replace( $this->productUrlRewriteGenerator->generate($product) ); } catch(\Exception $e) { $out->writeln('Duplicated url for '. $product->getId() .''); } }
Como você pode ver, o Magento 2 oferece um modelo para regravar url \ Magento \ CatalogUrlRewrite \ Model \ ProductUrlRewriteGenerator (productUrlRewriteGenerator) que você pode injetar em seu modelo.
Esta reescrita de URL gerada pode ser substituída por \ Magento \ UrlRewrite \ Model \ UrlPersistInterface (urlPersist).
Você pode executar isso em um loop para todos os produtos após a importação ou para cada produto único após uma alteração. Você encontra o URL reescreve na tabela url_rewrite no seu banco de dados. Isto é exatamente o mesmo que no Magento 1.