Magento 2: obtenir l'URL du produit de réécriture

15

J'essaie d'obtenir à rewrite product urlpartir du load productmodule personnalisé. Je reçois l'URL au http://localhost/m2/catalog/product/view/id/1401/category/23/format.

Mais je veux http://localhost/m2/juno-jacket.html

Voici le code

en constructeur

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

Fonction personnalisée

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

abc() method renvoyer l'URL comme http://localhost/m2/catalog/product/view/id/1401/category/23/

zed Blackbeard
la source
reconstruisez vos index
Marius
@Marius: j'ai aussi reconstruit. Il ne renvoie pas l'URL de réécriture du produit.
zed Blackbeard
votre produit est-il associé à un site Web?
Marius
J'ai attribué le produit sur le site Web principal
zed Blackbeard
getProductUrl()est censé renvoyer l'URL réécrite si l'entrée existe dans url_rewrite. Avez-vous supprimé manuellement les enregistrements de ce tableau?
musicliftsme

Réponses:

4

Voici la méthode que j'ai utilisée pour obtenir l'URL du produit.

Ce n'est certainement pas optimal car je dois charger tout le produit pour qu'il soit si mauvais en termes de performances.

Vous devez d'abord injecter un Magento\Catalog\Model\ProductRepositorydans votre constructeur:

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

Ensuite, vous chargez le produit en fonction de l'ID du produit:

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

Enfin, vous pouvez obtenir le modèle d'URL pour récupérer l'URL réécrite:

return $product->getUrlModel()->getUrl($product);
Raphael chez Digital Pianism
la source
La double virgule à la fin n'est pas prévue, n'est-ce pas?
Max
@Max ouais totalement, je l'ai supprimé
Raphael au Digital Pianism
5
Je fais face à la même chose et j'ai essayé votre code mais les URL sont toujours incorrectes pour moi. S'il vous plaît donnez votre avis.
Anshu Mishra
Une autre façon (et moins de perf-killer) peut être de forcer l'ajout de réécritures d'URL lors du chargement de la collection de produits. Voir ma réponse.
Hervé Guétin
même erreur pouvez-vous me dire où je peux mettre ce code?
Rahul Katoch
3

Cela ne répond peut-être pas vraiment à la question, mais il est probable que, si la réécriture de l'URL vous manque, vous retirez peut-être votre produit d'une collection de produits. Et l'ajout d'informations de réécriture d'URL n'est pas automatique comme vous pouvez le voir dans \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite.

La façon dont j'ai réussi à forcer l'ajout de réécritures d'URL consiste à créer un plugin sur la create()méthode de \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory. Et dès que votre code (ou le code de base de Magento) utilise cette usine pour instancier une collection de produits (et cela devrait, selon les meilleures pratiques), ce plugin force le \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewriteà true.

Ensuite, les réécritures d'URL de produits sont ajoutées avec succès aux produits sans qu'il soit nécessaire de les boucler et de les recharger. Il corrige ainsi l'inconvénient de la performance dont @Raphael a parlé.

Voici la définition XML du plugin (dans votre di.xmlfichier):

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

Et le code du 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
la source
J'ai essayé de cette façon, mais la classe de plugin ne s'exécute pas. Est-ce que tu sais pourquoi?
Deeps
0

Exportez vos produits vers un fichier csv

à partir du fichier csv dans Excel, utilisez cette formule pour la colonne url_key

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

où "P103" est la colonne url_key

CDzWebDev
la source