ID'den verimli url ürün url'si al


27

Sadece kimlik numarası verilen bir ürün URL'sini almanın en etkili yolu nedir? Kodumuzdaki birkaç yerde Mage::getModel('catalog/product')->load($id)->getProductUrl(), ürünün URL'sini almak için, ürünle ilgili olayların miktarı vb. Oldukça israf gibi göz önüne alındığında daha basit bir yöntem var mı? Bir kategori kimliği belirleme yeteneği de iyi olurdu.

Ek olarak, isim gibi bir ürün için tek bir özellik için aynı şeyi yapmak için etkili bir yöntem var mı?


1
Sorunuz burada çözüldü mü? Bu soru hakkında daha fazla yardıma ihtiyacınız var mı? Öyleyse bize bir çözüm bulmanıza yardımcı olmak için yapılması gerekenleri bildirin.
Philwinkle

Yanıtlar:


47

Ürün URL'sini tüm ürünü yüklemeden alabilir miyiz bilmek ilginç. Ana sorunuzu değil, ek sorunuzu yanıtladığım için üzgünüm, çünkü alabileceğimizden emin değilim :)

Tüm ürünü yüklemeden tek bir özellik almak için, getAttributeRawValue()Magento CE version 1.6+ kullanıyorsanız kullanabilirsiniz

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

@ Philwinkle'nin aşağıdaki yorumuna göre, burada daha fazla optimize edilmiş kod var:

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

GÜNCELLEME: Tüm ürünü yüklemeden kimliğine göre ürün URL'sini al:

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

8
Wowzers. Bunu bilmiyordum! Herkes bu cevabı aştı. Eğer gerçekten bir anteni yükseltmek istiyorsanız, arayarak mevcut bir katalog / ürün kaynak modelini (yerine yenisini başlatmak getResourceSingletonyerine) tekrar kullanabilirsiniz. $ storeId bir kimlik olmak zorunda değildir, bir Mage_Core_Model_Storenesne de olabilir, bu yüzden Mage::app()->getStore()işleri hızlandırmak için satır içi kullanabilirsiniz .
philwinkle

Ve birden fazla özellik almak için kullanabilirsiniz: @param int | string | array $ niteliği atrribute'nin kimlikleri veya kodları (1.7'de)
Richard

Bu yaklaşımı seviyorum, çok temiz. Ben oy verdim. URL'ye kimse cevap vermezse kabul edeceğim.
Peter O'Callaghan

Bu ürün kimliği olmadan da kullanılabilir mi? Sadece bir SKU'm varsa, modeli yüklemek zorunda mıyım?
pspahn

1
Aynı üründen daha fazlasının olması durumunda url_key, bunun işe yaramayabileceğini unutmayın, çünkü magento url_key'den farklı bir URL yeniden yazacaktır
Fra

11

Bunu bir koleksiyonla yapmanın faydalı olacağını düşünüyorum. Tam ürün bilgilerine ihtiyacınız yoksa, bir koleksiyon aracılığıyla yükleyebilir ve böylece yalnızca ihtiyacınız olan bilgileri yükleyebilirsiniz. Kod aşağıdaki gibi olacaktır.

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

Not: addUrlRewriteÜrün url'sini daha sonra alabilmeniz için, parametre olarak kategori kimliğini de alabilirsiniz, bu olmadan url kategori içermez.

Sonunda getProductUrl()hangisini kullanarak sonlandıracağınız biter Mage_Catalog_Model_Product_Url, ancak bu sadece kimliği, request_path ve url anahtarını gerektirir, bu yüzden tam ürün olmadan çalışması gerekir.


Bu iyi çalışıyor!
Mukesh Chapagain

Görünüşe göre $ Product-> getProductUrl () ihtiyacınız olan her şey olmalı. "AddUrlRewrite ()" ilavesi fark yaratır - bu örneği verdiğiniz için teşekkürler.
jschrab

4

Sanırım URL'yi yeniden yazılmış bir ürün elde etmenin en etkili yolu (yükleme ürünü olmadan ) doğrudan URL yeniden yazma masasına bakmaktır.

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

Tam kategori yolunu bulmak için

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

Düzenleme: "url_key" için test edildi, diğer özellikler getAttributeRawValueuygun olmalı.

  1. getRequestPathByIdPath

    • Toplam Dahil Duvar Saati (mikrosec): 8.323 mikrosec
    • Toplam Dahil CPU (mikroskoplar): 8,038 mikroskoplar
    • Toplam Dahil MemUse (bayt): 273,872 bayt
    • Toplam Dahil PeakMemUse (bayt): 213,488 bayt
    • Fonksiyon Çağrısı Sayısı: 372
  2. getAttributeRawValue

    • Toplam Dahil Duvar Saati (mikrosec): 51.213 mikrosek
    • Toplam Dahil CPU (mikrosec): 50.390 mikrosec
    • Toplam Dahil MemUse (bayt): 1,223,520 bayt
    • Toplam Dahil PeakMemUse (bayt): 1.168.496 bayt
    • Fonksiyon Çağrısı Sayısı: 2.233
  3. load(productId)

    • Toplam Dahil Duvar Saati (mikrosec): 605.649 mikrosec
    • Toplam Dahil CPU (mikroskoplar): 598,820 mikroskoplar
    • Toplam Dahil MemUse (bayt): 5,370,848 bayt
    • Toplam Dahil PeakMemUse (bayt): 5,314,384 bayt
    • Fonksiyon Çağrısı Sayısı: 27.774

3

Aynı soruyu merak ederek bu soruyu buldum. Ve sadece bir başkasının buna ihtiyaç duyması durumunda, kendi bulgularımı buraya göndereceğim.

Ürünün tamamını yüklemeden URL adresini almak için iki yöntem buldum. Yavaş bir sunucu üzerinde çalıştığım için en hızlı yükleme yöntemini bulmam gerekiyordu.

İlk yöntem:

İlki, ürün kimliğine dayalı bir ürün koleksiyonu:

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

İkinci yöntem:

Kalpesh Metha'nın yöntemini kullanan ikinci yöntem bu kod olacaktır:

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

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

Bu yöntem için, birini kullanabilirsiniz 'url_key'veya 'url_path'. Aradaki farkı bulamadım.

Yöntemler arasındaki fark:

İlk yöntem biraz daha fazla zaman alır (yaklaşık% 15 ekstra zaman). Ancak ikinci yöntem, yalnızca URL’nin son bölümünü döndürür. Bu, mağazanın URL’deki kategoriyi kullanması durumunda, o kısım gösterilmediğinden, çalışmayacağı anlamına gelir. Üzerinde çalıştığım dükkandaki durum buydu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.