Effizientes Abrufen der Produkt-URL von id


27

Was ist die effizienteste Methode, um eine Produkt-URL zu erhalten, wenn nur die ID angegeben wird? An einigen Stellen in unserem Code haben wir Dinge, wie zum Beispiel Mage::getModel('catalog/product')->load($id)->getProductUrl(), um die URL des Produkts abzurufen. Angesichts der Menge an Ereignissen usw., die mit einem Produkt verbunden sind, scheint dies ziemlich verschwenderisch zu sein. Gibt es eine einfachere Methode? Die Möglichkeit, auch eine Kategorie-ID anzugeben, wäre schön.

Gibt es außerdem eine effiziente Methode, um dasselbe für ein einzelnes Attribut für ein Produkt wie den Namen zu tun?


1
Wurde Ihre Frage hier gelöst? Benötigen Sie weitere Hilfe zu dieser Frage? Wenn ja, lassen Sie uns wissen, was zu tun ist, um eine Lösung zu finden.
Philwinkle

Antworten:


47

Interessant zu wissen, ob wir die Produkt-URL abrufen können, ohne das gesamte Produkt zu laden. Tut mir leid, deine zusätzliche Frage und nicht die Hauptfrage zu beantworten, da ich mir auch nicht sicher bin, ob wir sie bekommen können :)

Um ein einzelnes Attribut zu erhalten, ohne das gesamte Produkt zu laden, können getAttributeRawValue()Sie Magento CE ab Version 1.6 verwenden

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

Nach dem Kommentar von @ philwinkle unten ist hier ein optimierterer Code:

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

UPDATE: Produkt-URL anhand der ID abrufen, ohne das gesamte Produkt zu laden:

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

8
Wowzer. Wusste nichts davon! Alle haben diese Antwort positiv bewertet. Wenn Sie den Einsatz wirklich verbessern möchten, können Sie ein vorhandenes Katalog- / Produktressourcenmodell wiederverwenden (anstatt ein neues zu instanziieren), indem Sie getResourceSingletonstattdessen aufrufen . $ storeId muss keine ID sein, es kann auch ein Mage_Core_Model_StoreObjekt sein, sodass Sie Mage::app()->getStore()Inline verwenden können, um die Dinge zu beschleunigen.
Philwinkle

Und Sie können es verwenden, um mehrere Attribute abzurufen: @param int | string | array $ attribute atrributes IDs oder Codes (in 1.7)
Richard

Ich mag diesen Ansatz sehr ordentlich. Ich habe abgestimmt. Ich akzeptiere, wenn niemand eine Antwort auf die URL findet.
Peter O'Callaghan

Kann dies noch ohne eine Produkt-ID verwendet werden? Muss ich das Modell laden, wenn ich nur eine SKU besitze?
pspahn

1
Beachten Sie, dass url_keydies möglicherweise nicht funktioniert , wenn es mehr als ein Produkt mit demselben gibt, da Magento eine andere URL als url_key erstellt
Fra

11

Ich denke, es wäre vorteilhaft, dies über eine Sammlung zu tun. Wenn Sie nicht die vollständigen Produktinformationen benötigen, können Sie diese über eine Sammlung laden und nur die benötigten Informationen laden. Der Code wäre wie folgt.

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

Hinweis: addUrlRewriteDamit Sie die Produkt-URL später abrufen können, kann auch eine Kategorie-ID als Parameter verwendet werden. Ohne diese Angabe würde die URL die Kategorie nicht enthalten.

Sie rufen immer noch das auf, das letztendlich getProductUrl()verwendet wird Mage_Catalog_Model_Product_Url, aber dies benötigt nur die ID, den Anforderungspfad und den URL-Schlüssel, damit es ohne das vollständige Produkt funktionieren sollte.


Das funktioniert gut!
Mukesh Chapagain

$ Product-> getProductUrl () sollte alles sein, was Sie brauchen. Der Zusatz "addUrlRewrite ()" macht den Unterschied - danke, dass Sie dieses Beispiel angegeben haben.
Jschrab

4

Ich denke, der effizienteste Weg, um eine umgeschriebene URL für ein Produkt zu erhalten (ohne dass ein Produkt geladen wird ), besteht darin, direkt auf die URL-Umschreibung zuzugreifen.

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

Verwenden Sie, um den vollständigen Kategorienpfad abzurufen

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

Edit: auf "url_key" getestet, damit andere Attribute getAttributeRawValuepassen sollten.

  1. getRequestPathByIdPath

    • Insgesamt Inkl. Wandzeit (Mikrosekunden): 8.323 Mikrosekunden
    • Insgesamt Inkl. CPU (Mikrosekunden): 8.038 Mikrosekunden
    • Insgesamt Inkl. MemUse (Bytes): 273.872 Bytes
    • Insgesamt Inkl. PeakMemUse (Bytes): 213.488 Bytes
    • Anzahl der Funktionsaufrufe: 372
  2. getAttributeRawValue

    • Insgesamt Inkl. Wandzeit (Mikrosekunden): 51.213 Mikrosekunden
    • Insgesamt Inkl. CPU (Mikrosekunden): 50.390 Mikrosekunden
    • Insgesamt Inkl. MemUse (Bytes): 1.223.520 Bytes
    • Insgesamt Inkl. PeakMemUse (Bytes): 1.168.496 Bytes
    • Anzahl der Funktionsaufrufe: 2.233
  3. load(productId)

    • Insgesamt Inkl. Wandzeit (Mikrosekunde): 605.649 Mikrosekunden
    • Insgesamt Inkl. CPU (Mikrosekunden): 598.820 Mikrosekunden
    • Insgesamt Inkl. MemUse (Bytes): 5.370.848 Bytes
    • Insgesamt Inkl. PeakMemUse (Bytes): 5.314.384 Bytes
    • Anzahl der Funktionsaufrufe: 27.774

3

Ich habe diese Frage gefunden und mich auch gefragt. Und für den Fall, dass jemand anderes dies benötigt, werde ich meine eigenen Erkenntnisse hier veröffentlichen.

Ich habe zwei Methoden gefunden, um die Produkt-URL abzurufen, ohne das gesamte Produkt zu laden. Da ich auf einem langsamen Server arbeitete, musste ich die schnellste Lademethode finden.

Die erste Methode:

Der erste erhält eine Produktkollektion basierend auf der Produkt-ID:

$_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]"

Die zweite Methode:

Die zweite Methode, die die Methode von Kalpesh Metha verwendet, wäre dieser Code:

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

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

Für diese Methode können Sie entweder 'url_key'oder verwenden'url_path' . Den Unterschied habe ich allerdings nicht herausgefunden.

Der Unterschied zwischen den Methoden:

Die erste Methode benötigt etwas mehr Zeit (ca. 15% mehr Zeit). Die zweite Methode gibt jedoch nur den letzten Teil der URL zurück. Dies bedeutet, dass, wenn der Shop die Kategorie in der URL verwendet, dies nicht funktioniert, da dieser Teil nicht angezeigt wird. Dies war der Fall in dem Geschäft, an dem ich arbeitete.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.