Obtenir efficacement l'URL du produit à partir de l'ID


27

Quel est le moyen le plus efficace d'obtenir une URL de produit, juste en fonction de son ID? À certains endroits de notre code, nous avons des choses telles que Mage::getModel('catalog/product')->load($id)->getProductUrl()pour obtenir l'URL du produit, étant donné la quantité d'événements, etc. associés à un produit, cela semble plutôt inutile, existe-t-il une méthode plus simple? La possibilité de spécifier également un identifiant de catégorie serait bien.

De plus, existe-t-il une méthode efficace pour faire la même chose pour un seul attribut pour un produit tel que le nom?


1
Votre question a-t-elle été résolue ici? Avez-vous eu besoin de plus d'aide sur cette question? Si oui, faites-nous savoir ce qui doit être fait pour vous aider à trouver une solution.
philwinkle

Réponses:


47

Intéressant de savoir si nous pouvons obtenir l'URL du produit sans charger le produit entier. Désolé de répondre à votre question supplémentaire et non à la question principale, car je ne sais pas non plus si nous pouvons l'obtenir :)

Pour obtenir un seul attribut sans charger le produit entier, vous pouvez utiliser getAttributeRawValue()si vous utilisez Magento CE version 1.6+

Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);

Selon le commentaire de @ philwinkle ci-dessous, voici un code plus optimisé:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'attribute_code', Mage::app()->getStore());

MISE À JOUR: Obtenez l'URL du produit par ID sans charger le produit entier:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());

8
Wowzers. Je ne connaissais pas celui-là! Tout le monde vote favorablement cette réponse. Si vous voulez vraiment augmenter la mise, vous pouvez réutiliser un modèle de ressource de catalogue / produit existant (au lieu d'instancier un nouveau) en appelant à la getResourceSingletonplace. $ storeId n'a pas besoin d'être un identifiant, il peut aussi être un Mage_Core_Model_Storeobjet, vous pouvez donc utiliser Mage::app()->getStore()inline pour accélérer les choses.
philwinkle

Et vous pouvez l'utiliser pour récupérer plusieurs attributs: @param int | string | array $ attribute atrribute's ids ou codes (en 1.7)
Richard

J'aime bien cette approche, très soignée. J'ai voté positivement. J'accepte si personne ne répond à l'URL.
Peter O'Callaghan

Peut-il encore être utilisé sans ID produit? Si je n'ai qu'une référence, suis-je obligé de charger le modèle?
pspahn

1
Notez que dans le cas où il existe plus d'un produit avec le même, url_keycela peut ne pas fonctionner car magento va créer une réécriture d'URL différente de la clé url
Fra

11

Je pense qu'il serait avantageux de le faire via une collection. Si vous n'avez pas besoin des informations complètes sur le produit, vous pouvez les charger via une collection et donc uniquement charger les informations dont vous avez besoin. Le code serait le suivant.

$product_collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('entity_id', 16)
    ->addUrlRewrite();
$product_collection_url = $product_collection->getFirstItem()->getProductUrl();

Remarque: addUrlRewriteafin que vous puissiez obtenir l'URL du produit plus tard, cela peut également prendre un identifiant de catégorie comme paramètre, sans cela, l'URL ne contiendrait pas la catégorie.

Vous finissez toujours par appeler le getProductUrl()qui finit par utiliser Mage_Catalog_Model_Product_Url, mais cela n'a besoin que de l'id, request_path et de la clé url pour que cela fonctionne sans le produit complet.


Cela fonctionne bien!
Mukesh Chapagain

Il semblerait que $ Product-> getProductUrl () devrait être tout ce dont vous avez besoin. L'ajout "addUrlRewrite ()" fait la différence - merci d'avoir fourni cet exemple.
jschrab

4

Je suppose que la façon la plus efficace d'obtenir une URL de produit réécrite (sans chargement de produit) est de regarder directement sur talbe de réécriture d'URL.

# returns string "product-url.html"
$productUrl = Mage::getResourceModel('core/url_rewrite')
    ->getRequestPathByIdPath('product/' . $productId, $storeId);

Pour obtenir le chemin de catégorie complet, utilisez

# returns string "full/category/path/product-url.html"
$productUrl = Mage::getResourceModel('core/url_rewrite')
    ->getRequestPathByIdPath('product/' . $productId . '/' . $categoryId, $storeId);

Edit: testé pour "url_key", pour d'autres attributs getAttributeRawValuedevraient convenir.

  1. getRequestPathByIdPath

    • Total incl. Temps de mur (microsec): 8,323 microsecs
    • Total incl. CPU (microsecs): 8 038 microsecs
    • Total incl. MemUse (octets): 273 872 octets
    • Total incl. PeakMemUse (octets): 213 488 octets
    • Nombre d'appels de fonction: 372
  2. getAttributeRawValue

    • Total incl. Temps de paroi (microsec): 51,213 microsecs
    • Total incl. CPU (microsecs): 50,390 microsecs
    • Total incl. MemUse (octets): 1 223 520 octets
    • Total incl. PeakMemUse (octets): 1 168 496 octets
    • Nombre d'appels de fonction: 2 233
  3. load(productId)

    • Total incl. Temps de mur (microsec): 605,649 microsecs
    • Total incl. CPU (microsecs): 598 820 microsecs
    • Total incl. MemUse (octets): 5 370 848 octets
    • Total incl. PeakMemUse (octets): 5 314 384 octets
    • Nombre d'appels de fonction: 27 774

3

J'ai trouvé cette question, me posant la même question. Et juste au cas où quelqu'un d'autre en aurait besoin, je posterai mes propres découvertes ici.

J'ai trouvé deux méthodes pour obtenir l'URL du produit sans charger le produit complet. Comme je travaillais sur un serveur lent, je devais trouver la méthode de chargement la plus rapide.

La première méthode:

La première collection de produits est basée sur l'ID du produit:

$_item = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('product_url')
    ->addAttributeToFilter('entity_id', $productId)
    ->addUrlRewrite()
    ->load();

foreach($_item as $product){
    echo $product->getProductUrl();
}

// returns string "http://www.your-domain.com/[category]/[product_url]"

La deuxième méthode:

La deuxième méthode, utilisant la méthode de Kalpesh Metha, serait ce code:

Mage::getResourceSingleton('catalog/product')
      ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());

// returns string "product-url-like-this"

Pour cette méthode, vous pouvez utiliser 'url_key'ou 'url_path'. Je n'ai cependant pas découvert la différence.

La différence entre les méthodes:

La première méthode prend un peu plus de temps (environ 15% de temps supplémentaire). Cependant, la deuxième méthode ne renvoie que la dernière partie de l'URL. Cela signifie que si la boutique utilise la catégorie dans l'URL, cela ne fonctionnera pas, car cette partie n'est pas affichée. C'était le cas dans la boutique sur laquelle je travaillais.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.