รับ URL ผลิตภัณฑ์จาก id อย่างมีประสิทธิภาพ


27

วิธีที่มีประสิทธิภาพมากที่สุดในการรับ URL ของผลิตภัณฑ์คือ ID คืออะไร ในบางแห่งในรหัสของเราเรามีสิ่งต่าง ๆ เช่นMage::getModel('catalog/product')->load($id)->getProductUrl()เพื่อให้ได้ URL ของผลิตภัณฑ์เนื่องจากจำนวนของกิจกรรมและอื่น ๆ ที่เกี่ยวข้องกับผลิตภัณฑ์ที่ดูเหมือนจะค่อนข้างสิ้นเปลืองมีวิธีที่ง่ายกว่าไหม ความสามารถในการระบุรหัสหมวดหมู่ก็ดีเช่นกัน

นอกจากนี้มีวิธีที่มีประสิทธิภาพในการทำสิ่งเดียวกันสำหรับแอตทริบิวต์เดียวสำหรับผลิตภัณฑ์เช่นชื่อหรือไม่


1
คำถามของคุณไม่ได้รับการแก้ไขที่นี่? คุณต้องการความช่วยเหลือเพิ่มเติมสำหรับคำถามนี้หรือไม่? ถ้าเป็นเช่นนั้นให้เรารู้ว่าต้องทำอะไรเพื่อช่วยคุณหาทางแก้ปัญหา
philwinkle

คำตอบ:


47

สนใจทราบว่าเราสามารถรับ URL ผลิตภัณฑ์โดยไม่ต้องโหลดผลิตภัณฑ์ทั้งหมดหรือไม่ ขออภัยที่จะตอบคำถามเพิ่มเติมของคุณไม่ใช่คำถามหลักเนื่องจากฉันไม่แน่ใจว่าเราจะได้รับ :)

สำหรับการรับคุณสมบัติเดียวโดยไม่ต้องโหลดผลิตภัณฑ์ทั้งหมดคุณสามารถใช้getAttributeRawValue()หากคุณใช้ Magento CE เวอร์ชัน 1.6+

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

ตามความคิดเห็นของ @ philwinkle ด้านล่างนี่คือรหัสที่เหมาะสมที่สุด:

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

อัปเดต: รับ URL ผลิตภัณฑ์ตาม ID โดยไม่ต้องโหลดผลิตภัณฑ์ทั้งหมด:

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

8
Wowzers ไม่รู้เกี่ยวกับอันนั้น! ทุกคนถอนคำตอบนี้ หากคุณต้องการเพิ่ม ante จริง ๆ คุณสามารถใช้โมเดลทรัพยากรแคตตาล็อก / ผลิตภัณฑ์ที่มีอยู่เดิม (แทนการสร้างอินสแตนซ์ใหม่) โดยการโทรgetResourceSingletonแทน $ storeId ไม่จำเป็นต้องเป็น id มันสามารถเป็นMage_Core_Model_Storeอ็อบเจกต์ได้เช่นกันดังนั้นคุณสามารถใช้Mage::app()->getStore()อินไลน์เพื่อเร่งความเร็วสิ่งต่างๆ
philwinkle

และคุณสามารถใช้มันเพื่อดึงคุณสมบัติหลายอย่าง: @param int | string | array $ attribute รหัสหรือรหัสของ atrribute (ใน 1.7)
Richard

ฉันชอบวิธีนี้เรียบร้อยมาก ฉันได้รับการโหวต ฉันจะยอมรับถ้าไม่มีใครคิดคำตอบสำหรับ URL
Peter O'Callaghan

ยังสามารถใช้งานได้โดยไม่มีรหัสผลิตภัณฑ์หรือไม่? หากฉันมี SKU ฉันจะบังคับให้โหลดแบบจำลองหรือไม่
pspahn

1
โปรดทราบว่าในกรณีที่มีผลิตภัณฑ์มากกว่าตัวเดียวกันurl_keyสิ่งนี้อาจไม่ได้ผลเพราะวีโอไอพีจะสร้างการเขียน url ที่แตกต่างจาก url_key อีกครั้ง
Fra

11

ฉันคิดว่ามันจะเป็นประโยชน์ในการทำสิ่งนี้ผ่านคอลเลกชัน หากคุณไม่ต้องการข้อมูลผลิตภัณฑ์ที่สมบูรณ์คุณสามารถโหลดได้จากคอลเล็กชันและโหลดเฉพาะข้อมูลที่คุณต้องการ รหัสจะเป็นดังนี้

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

หมายเหตุ: addUrlRewriteเพื่อที่คุณจะได้รับ URL ผลิตภัณฑ์ในภายหลังซึ่งสามารถใช้รหัสหมวดหมู่เป็นพารามิเตอร์โดยไม่มี URL นี้จะไม่มีหมวดหมู่

คุณยังคงสิ้นสุดการโทรgetProductUrl()ซึ่งจะสิ้นสุดการใช้Mage_Catalog_Model_Product_Urlงาน แต่สิ่งนี้ต้องการเพียง id, request_path และคีย์ url เท่านั้นดังนั้นจึงควรใช้งานได้โดยไม่มีผลิตภัณฑ์เต็ม


มันใช้งานได้ดี!
Mukesh Chapagain

ดูเหมือนว่า $ Product-> getProductUrl () ควรเป็นสิ่งที่คุณต้องการ การเพิ่ม "addUrlRewrite ()" สร้างความแตกต่าง - ขอบคุณที่ให้ตัวอย่างนั้น
jschrab

4

ฉันคิดว่าวิธีที่มีประสิทธิภาพที่สุดในการรับ URL ผลิตภัณฑ์ที่เขียนใหม่(โดยไม่ต้องโหลดผลิตภัณฑ์)คือดูโดยตรงบนการเขียน URL ซ้ำ

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

เพื่อรับเส้นทางหมวดหมู่เต็มให้ใช้

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

แก้ไข:ทดสอบสำหรับ "url_key" สำหรับแอตทริบิวต์อื่น ๆgetAttributeRawValueควรพอดี

  1. getRequestPathByIdPath

    • รวม กำแพงเวลา (ไมโคร): 8,323 ไมโครเซส
    • รวม CPU (ไมโครไซต์): 8,038 microsecs
    • รวม MemUse (ไบต์): 273,872 ไบต์
    • รวม PeakMemUse (ไบต์): 213,488 ไบต์
    • จำนวนการเรียกใช้ฟังก์ชัน: 372
  2. getAttributeRawValue

    • รวม Wall Wall (microsec): 51,213 microsecs
    • รวม CPU (microsecs): 50,390 microsecs
    • รวม MemUse (ไบต์): 1,223,520 ไบต์
    • รวม PeakMemUse (ไบต์): 1,168,496 ไบต์
    • จำนวนการเรียกใช้ฟังก์ชัน: 2,233
  3. load(productId)

    • รวม เวลากำแพง (ไมโครไซต์): 605,649 microsecs
    • รวม CPU (ไมโครไซต์): 598,820 microsecs
    • รวม MemUse (ไบต์): 5,370,848 ไบต์
    • รวม PeakMemUse (ไบต์): 5,314,384 ไบต์
    • จำนวนการเรียกใช้ฟังก์ชัน: 27,774

3

ฉันพบคำถามนี้สงสัยเหมือนกัน และในกรณีที่บางคนต้องการเวลานี้ฉันจะโพสต์สิ่งที่ฉันค้นพบที่นี่

ฉันพบสองวิธีในการรับ URL ผลิตภัณฑ์โดยไม่โหลดผลิตภัณฑ์ที่สมบูรณ์ ตั้งแต่ฉันทำงานบนเซิร์ฟเวอร์ที่ช้าฉันต้องหาวิธีโหลดที่เร็วที่สุด

วิธีแรก:

การรับครั้งแรกเป็นการรวบรวมผลิตภัณฑ์ตามรหัสผลิตภัณฑ์

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

วิธีที่สอง:

วิธีที่สองโดยใช้วิธี Kalpesh Metha จะเป็นรหัสนี้:

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

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

สำหรับวิธีนี้คุณสามารถใช้หรือ'url_key' 'url_path'ฉันไม่ได้พบความแตกต่างว่า

ความแตกต่างระหว่างวิธีการ:

วิธีแรกใช้เวลาเพิ่มขึ้นเล็กน้อย (เพิ่มเวลาประมาณ 15%) อย่างไรก็ตามวิธีที่สองส่งกลับเฉพาะส่วนสุดท้ายของ URL เท่านั้น ซึ่งหมายความว่าหากร้านค้าใช้หมวดหมู่ใน URL มันจะไม่ทำงานเนื่องจากส่วนนั้นจะไม่แสดง นี่เป็นกรณีในร้านค้าที่ฉันทำงานอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.