Wydajne pobieranie adresu URL produktu z identyfikatora

27

Jaki jest najskuteczniejszy sposób uzyskania adresu URL produktu, podając tylko jego identyfikator? W kilku miejscach w naszym kodzie mamy takie rzeczy, jak Mage::getModel('catalog/product')->load($id)->getProductUrl()na przykład uzyskanie adresu URL produktu, biorąc pod uwagę ilość zdarzeń itp. Związanych z produktem, wydaje się to raczej marnotrawstwem, czy istnieje prostsza metoda? Przydałaby się możliwość określenia identyfikatora kategorii.

Ponadto, czy istnieje skuteczna metoda robienia tego samego dla pojedynczego atrybutu produktu, takiego jak nazwa?

Peter O'Callaghan
źródło
1
czy twoje pytanie zostało tutaj rozwiązane? Potrzebujesz dodatkowej pomocy w tym pytaniu? Jeśli tak, daj nam znać, co należy zrobić, aby znaleźć rozwiązanie.
philwinkle

Odpowiedzi:

47

Ciekawe, czy możemy uzyskać adres URL produktu bez ładowania całego produktu. Przepraszam, że odpowiedziałem na dodatkowe pytanie, a nie na pytanie główne, ponieważ nie jestem również pewien, czy możemy je uzyskać :)

Aby uzyskać pojedynczy atrybut bez ładowania całego produktu, możesz go użyć, getAttributeRawValue()jeśli używasz Magento CE w wersji 1.6+

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

Zgodnie z komentarzem @ philwinkle poniżej znajduje się bardziej zoptymalizowany kod:

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

AKTUALIZACJA: Uzyskaj adres URL produktu według identyfikatora bez ładowania całego produktu:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());
Kalpesh
źródło
8
Wowzers. Nie wiedziałem o tym! Wszyscy głosują za odpowiedzią. Jeśli naprawdę chcesz zwiększyć stawkę ante, możesz ponownie użyć istniejącego modelu zasobów katalogu / produktu (zamiast tworzenia nowego), dzwoniąc w getResourceSingletonzamian. $ storeId nie musi być identyfikatorem, może być również Mage_Core_Model_Storeobiektem, więc możesz użyć funkcji Mage::app()->getStore()inline, aby przyspieszyć działanie.
philwinkle
I możesz go użyć do pobrania wielu atrybutów: @param int | string | array $ atrybut identyfikatory lub kody atrribute (w 1.7)
Richard
Bardzo podoba mi się to podejście. Głosowałem za tym. Zaakceptuję, jeśli nikt nie wymyśli odpowiedzi na adres URL.
Peter O'Callaghan,
Czy można tego nadal używać bez identyfikatora produktu? Jeśli mam tylko SKU, czy jestem zmuszony załadować model?
pspahn
1
Pamiętaj, że w przypadku, gdy jest więcej niż jeden produkt z tym samym, url_keymoże to nie działać, ponieważ Magento utworzy przepisanie innego adresu URL niż url_key
Fra
11

Myślę, że byłoby to korzystne, gdybyśmy to zrobili za pośrednictwem kolekcji. Jeśli nie potrzebujesz pełnych informacji o produkcie, możesz załadować je za pośrednictwem kolekcji, a więc załaduj tylko te informacje, których potrzebujesz. Kod byłby następujący.

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

Uwaga: addUrlRewriteaby później uzyskać adres URL produktu, może on również przyjmować identyfikator kategorii jako parametr, bez tego adres URL nie zawierałby kategorii.

Wciąż dzwonisz do tego, getProductUrl()co się kończy Mage_Catalog_Model_Product_Url, ale to wymaga tylko identyfikatora, request_path i klucza adresu URL, więc powinno działać bez pełnego produktu.

David Manners
źródło
To działa dobrze!
Mukesh Chapagain
Wydaje się, że $ Product-> getProductUrl () powinno być wszystkim, czego potrzebujesz. Dodatek „addUrlRewrite ()” robi różnicę - dziękuję za podanie tego przykładu.
jschrab
4

Wydaje mi się, że najskuteczniejszym sposobem na przepisanie adresu URL produktu (bez ładowania produktu) jest spojrzenie bezpośrednio na przepisanie adresu URL talbe.

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

Aby uzyskać pełną ścieżkę kategorii, użyj

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

Edycja: testowane na „url_key”, dla innych atrybutów getAttributeRawValuepowinny pasować.

  1. getRequestPathByIdPath

    • Razem z Czas ścienny (mikrosekund): 8323 mikrosekund
    • Razem z Procesor (mikrosekundy): 8038 mikrosekund
    • Razem z MemUse (bytes): 273,872 bajtów
    • Razem z PeakMemUse (bytes): 213,488 bajtów
    • Liczba wywołań funkcji: 372
  2. getAttributeRawValue

    • Razem z Czas ścienny (mikrosekund): 51 213 mikrosekund
    • Razem z Procesor (mikrosekundy): 50 390 mikrosekund
    • Razem z MemUse (bajty): 1 223 520 bajtów
    • Razem z PeakMemUse (bytes): 1168496 bajtów
    • Liczba wywołań funkcji: 2233
  3. load(productId)

    • Razem z Czas ścienny (mikrosekund): 605,649 mikrosekund
    • Razem z Procesor (mikrosekundy): 598,820 mikrosekund
    • Razem z MemUse (bytes): 5370848 bajtów
    • Razem z PeakMemUse (bytes): 5,314,384 bajtów
    • Liczba wywołań funkcji: 27 774
sv3n
źródło
3

Znalazłem to pytanie, zastanawiam się tak samo. I na wypadek, gdyby ktoś inny tego potrzebował, opublikuję tutaj własne ustalenia.

Znalazłem dwie metody uzyskania adresu URL produktu bez ładowania pełnego produktu. Ponieważ pracowałem na wolnym serwerze, musiałem znaleźć najszybszą metodę ładowania.

Pierwsza metoda:

Pierwsze pobranie to kolekcja produktów na podstawie identyfikatora produktu:

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

Druga metoda:

Drugą metodą, wykorzystującą metodę Kalpesh Metha, byłby następujący kod:

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

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

Dla tej metody możesz użyć 'url_key'albo 'url_path'. Nie znalazłem jednak różnicy.

Różnica między metodami:

Pierwsza metoda zajmuje nieco więcej czasu (około 15% dodatkowego czasu). Druga metoda zwraca jednak tylko ostatnią część adresu URL. Oznacza to, że jeśli sklep używa kategorii w adresie URL, nie będzie działać, ponieważ ta część nie jest wyświetlana. Tak było w sklepie, nad którym pracowałem.

Sander Koedood
źródło