Dapatkan URL produk secara efisien dari id

27

Apa cara paling efisien untuk mendapatkan url produk hanya dengan diberikan ID? Di beberapa tempat dalam kode kita, kita memiliki hal-hal seperti Mage::getModel('catalog/product')->load($id)->getProductUrl()untuk mendapatkan URL produk, mengingat jumlah peristiwa dll yang terkait dengan produk ini tampaknya agak boros, apakah ada metode yang lebih sederhana? Kemampuan untuk juga menentukan id kategori akan menyenangkan.

Selain itu, adakah metode yang efisien untuk melakukan hal yang sama untuk satu atribut untuk produk seperti nama?

Peter O'Callaghan
sumber
1
apakah pertanyaan Anda diselesaikan di sini? Apakah Anda memerlukan bantuan lebih lanjut tentang pertanyaan ini? Jika demikian beri tahu kami apa yang perlu dilakukan untuk membantu Anda menemukan solusi.
philwinkle

Jawaban:

47

Menarik untuk mengetahui apakah kami bisa mendapatkan URL produk tanpa memuat seluruh produk. Maaf untuk menjawab pertanyaan tambahan Anda dan bukan pertanyaan utama, karena saya juga tidak yakin apakah kami bisa mendapatkannya :)

Untuk mendapatkan atribut tunggal tanpa memuat seluruh produk, Anda dapat menggunakan getAttributeRawValue()jika Anda menggunakan Magento CE versi 1.6+

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

Sesuai komentar @ philwinkle di bawah ini, berikut adalah kode yang lebih dioptimalkan:

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

UPDATE: Dapatkan URL produk dengan ID tanpa memuat seluruh produk:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());
Kalpesh
sumber
8
Wowzers. Tidak tahu tentang itu! Semua orang menghargai jawaban ini. Jika Anda benar-benar ingin meningkatkan taruhan, Anda dapat menggunakan kembali katalog / model sumber daya produk yang ada (alih-alih membuat contoh yang baru) dengan menelepon getResourceSingletonsebagai gantinya. $ storeId tidak harus berupa id, itu bisa menjadi Mage_Core_Model_Storeobjek juga, jadi Anda bisa menggunakan Mage::app()->getStore()inline untuk mempercepat.
philwinkle
Dan Anda dapat menggunakannya untuk mengambil beberapa atribut: @param int | string | array $ atribut atrribute's atau kode (dalam 1,7)
Richard
Saya suka pendekatan ini, sangat rapi. Saya telah terpilih. Saya akan menerima jika tidak ada yang memberikan jawaban untuk URL.
Peter O'Callaghan
Apakah ini masih dapat digunakan tanpa ID produk? Jika saya hanya memiliki SKU, apakah saya terpaksa memuat model?
pspahn
1
Perhatikan bahwa jika ada lebih dari satu produk dengan yang sama url_keyini mungkin tidak berfungsi karena magento akan membuat url menulis ulang yang berbeda dari url_key
Fra
11

Saya pikir akan bermanfaat untuk melakukan ini melalui koleksi. Jika Anda tidak memerlukan informasi produk lengkap maka Anda dapat memuatnya melalui koleksi dan hanya memuat informasi yang Anda butuhkan. Kode tersebut adalah sebagai berikut.

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

Catatan: addUrlRewriteagar Anda bisa mendapatkan url produk nanti, ini juga dapat mengambil id kategori sebagai parameter, tanpa ini url tidak akan berisi kategori.

Anda masih akhirnya memanggil getProductUrl()yang akhirnya menggunakan Mage_Catalog_Model_Product_Url, tetapi ini hanya membutuhkan id, request_path dan kunci url sehingga harus berfungsi tanpa produk lengkap.

David Manners
sumber
Ini bekerja dengan baik!
Mukesh Chapagain
Tampaknya $ Product-> getProductUrl () harus menjadi semua yang Anda butuhkan. Tambahan "addUrlRewrite ()" membuat perbedaan - terima kasih telah memberikan contoh itu.
jschrab
4

Saya kira cara paling efisien untuk mendapatkan produk ditulis ulang URL (tanpa memuat produk) adalah dengan melihat langsung pada penulisan ulang URL talbe.

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

Untuk mendapatkan jalur kategori lengkap, gunakan

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

Sunting: diuji untuk "url_key", untuk atribut lainnya getAttributeRawValueharus sesuai.

  1. getRequestPathByIdPath

    • Total Termasuk Waktu Dinding (microsec): 8.332 microsecs
    • Total Termasuk CPU (microsecs): 8.038 microsecs
    • Total Termasuk MemUse (byte): 273.872 byte
    • Total Termasuk PeakMemUse (byte): 213.488 byte
    • Jumlah Panggilan Fungsi: 372
  2. getAttributeRawValue

    • Total Termasuk Waktu Dinding (microsec): 51.213 microsecs
    • Total Termasuk CPU (mikrod): 50.390 mikrod
    • Total Termasuk MemUse (byte): 1.223.520 byte
    • Total Termasuk PeakMemUse (bytes): 1.168.496 bytes
    • Jumlah Panggilan Fungsi: 2.233
  3. load(productId)

    • Total Termasuk Waktu Dinding (microsec): 605.649 microsecs
    • Total Termasuk CPU (mikrod): 598.820 mikrod
    • Total Termasuk MemUse (bytes): 5.370.848 bytes
    • Total Termasuk PeakMemUse (bytes): 5.314.384 bytes
    • Jumlah Panggilan Fungsi: 27.774
sv3n
sumber
3

Saya menemukan pertanyaan ini, bertanya-tanya sama. Dan kalau-kalau ada orang lain yang membutuhkan ini kapan-kapan, saya akan posting temuan saya sendiri di sini.

Saya menemukan dua metode untuk mendapatkan URL produk tanpa memuat produk lengkap. Karena saya bekerja pada server yang lambat, saya perlu menemukan metode pemuatan tercepat.

Metode pertama:

Dapatkan pertama adalah koleksi produk berdasarkan ID produk:

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

Metode kedua:

Metode kedua, menggunakan metode Kalpesh Metha, akan menjadi kode ini:

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

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

Untuk metode ini, Anda dapat menggunakan 'url_key'atau 'url_path'. Saya belum menemukan perbedaannya.

Perbedaan antara metode:

Metode pertama membutuhkan waktu sedikit lebih banyak (sekitar 15% waktu tambahan). Namun metode kedua, hanya mengembalikan bagian akhir dari URL. Ini berarti bahwa jika toko menggunakan kategori dalam URL, itu tidak akan berfungsi, karena bagian itu tidak ditampilkan. Ini adalah kasus di toko yang sedang saya kerjakan.

Sander Koedood
sumber