Nhận url sản phẩm hiệu quả từ id


27

Cách hiệu quả nhất để nhận url sản phẩm được cung cấp chỉ là ID đó là gì? Ở một vài nơi trong mã của chúng tôi, chúng tôi có những thứ như Mage::getModel('catalog/product')->load($id)->getProductUrl()để có được URL của sản phẩm, với số lượng sự kiện, vv liên quan đến một sản phẩm, điều này có vẻ khá lãng phí, có phương pháp nào đơn giản hơn không? Khả năng cũng chỉ định một id danh mục sẽ tốt đẹp.

Ngoài ra, có một phương pháp hiệu quả để làm điều tương tự cho một thuộc tính duy nhất cho một sản phẩm như tên không?


1
câu hỏi của bạn đã được giải quyết ở đây? Bạn có cần giúp đỡ thêm về câu hỏi này? Nếu vậy hãy cho chúng tôi biết những gì cần phải được thực hiện để giúp bạn tìm ra giải pháp.
philwinkle

Câu trả lời:


47

Thật thú vị khi biết liệu chúng ta có thể lấy URL sản phẩm mà không cần tải toàn bộ sản phẩm hay không. Xin lỗi để trả lời câu hỏi bổ sung của bạn và không phải là câu hỏi chính, vì tôi cũng không chắc chúng ta có thể nhận được nó không :)

Để có được một thuộc tính duy nhất mà không tải toàn bộ sản phẩm, bạn có thể sử dụng getAttributeRawValue() nếu bạn đang sử dụng Magento CE phiên bản 1.6+

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

Theo nhận xét của @ philwinkle bên dưới, đây là mã được tối ưu hóa hơn:

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

CẬP NHẬT: Nhận URL sản phẩm bằng ID mà không cần tải toàn bộ sản phẩm:

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

8
Ái chà. Không biết về điều đó! Mọi người nêu lên câu trả lời này. Nếu bạn thực sự muốn tăng ante, bạn có thể sử dụng lại mô hình tài nguyên danh mục / sản phẩm hiện có (thay vì khởi tạo một cái mới) bằng cách gọi getResourceSingletonthay thế. $ storeId không phải là id, nó cũng có thể là một Mage_Core_Model_Stoređối tượng, vì vậy bạn có thể sử dụng Mage::app()->getStore()nội tuyến để tăng tốc mọi thứ.
philwinkle

Và bạn có thể sử dụng nó để tìm nạp nhiều thuộc tính: @param int | string | mảng $ thuộc tính atrribution 'ids hoặc mã (trong 1.7)
Richard

Tôi thích cách tiếp cận này, rất gọn gàng. Tôi đã bỏ phiếu. Tôi sẽ chấp nhận nếu không ai đưa ra câu trả lời cho URL.
Peter O'Callaghan

Điều này vẫn có thể được sử dụng mà không cần ID sản phẩm? Nếu tôi chỉ có SKU, tôi có bị buộc phải tải mô hình không?
pspahn

1
Lưu ý rằng trong trường hợp có nhiều hơn một sản phẩm giống nhau url_keythì điều này có thể không hoạt động vì magento sẽ tạo một url viết lại khác từ url_key
Fra

11

Tôi nghĩ rằng sẽ có ích khi làm điều này thông qua một bộ sưu tập. Nếu bạn không cần thông tin sản phẩm đầy đủ thì bạn có thể tải thông qua bộ sưu tập và do đó chỉ tải thông tin bạn cần. Mã sẽ như sau.

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

Lưu ý: addUrlRewriteđể sau này bạn có thể lấy url sản phẩm, điều này cũng có thể lấy id danh mục làm tham số, nếu không có url này sẽ không chứa danh mục.

Bạn vẫn đang kết thúc cuộc gọi getProductUrl()mà cuối cùng sử dụng Mage_Catalog_Model_Product_Url, nhưng điều này chỉ cần id, request_path và khóa url để nó hoạt động mà không có sản phẩm đầy đủ.


Điều này làm việc tốt!
Mukesh Chapagain

Có vẻ như $ Product-> get SẢNtUrl () sẽ là tất cả những gì bạn cần. Bổ sung "addUrlRewrite ()" tạo ra sự khác biệt - cảm ơn vì đã cung cấp ví dụ đó.
jschrab

4

Tôi đoán cách hiệu quả nhất để có được một URL viết lại sản phẩm (w / o đang tải sản phẩm) là xem trực tiếp trên URL viết lại Talbe.

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

Để có được đường dẫn danh mục đầy đủ, sử dụng

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

Chỉnh sửa: đã kiểm tra "url_key", vì các thuộc tính khác getAttributeRawValuephải phù hợp.

  1. getRequestPathByIdPath

    • Tổng số bao gồm Thời gian treo tường (microsec): 8.323 microsec
    • Tổng số bao gồm CPU (microsec): 8.038 microsec
    • Tổng số bao gồm MemUse (byte): 273.872 byte
    • Tổng số bao gồm PeakMemUse (byte): 213,488 byte
    • Số lượng các cuộc gọi chức năng: 372
  2. getAttributeRawValue

    • Tổng số bao gồm Thời gian treo tường (microsec): 51.213 microsec
    • Tổng số bao gồm CPU (microsec): 50.390 microsec
    • Tổng số bao gồm MemUse (byte): 1.223,520 byte
    • Tổng số bao gồm PeakMemUse (byte): 1,168,496 byte
    • Số lượng cuộc gọi chức năng: 2.233
  3. load(productId)

    • Tổng số bao gồm Thời gian treo tường (microsec): 605.649 microsec
    • Tổng số bao gồm CPU (microsec): 598.820 microsec
    • Tổng số bao gồm MemUse (byte): 5,370,848 byte
    • Tổng số bao gồm PeakMemUse (byte): 5.314.384 byte
    • Số lượng cuộc gọi chức năng: 27.774

3

Tôi tìm thấy câu hỏi này, tự hỏi tương tự. Và chỉ trong trường hợp người khác cần điều này đôi khi, tôi sẽ đăng những phát hiện của riêng tôi ở đây.

Tôi tìm thấy hai phương pháp lấy URL sản phẩm mà không tải sản phẩm hoàn chỉnh. Vì tôi đang làm việc trên một máy chủ chậm, tôi cần tìm phương thức tải nhanh nhất.

Phương pháp đầu tiên:

Bộ sưu tập sản phẩm đầu tiên dựa trên ID sản phẩm:

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

Phương pháp thứ hai:

Phương thức thứ hai, sử dụng phương pháp của Kalpesh Metha, sẽ là mã này:

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

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

Đối với phương pháp này, bạn có thể sử dụng 'url_key'hoặc 'url_path'. Tôi đã không tìm ra sự khác biệt mặc dù.

Sự khác biệt giữa các phương thức:

Phương pháp đầu tiên mất nhiều thời gian hơn một chút (thêm khoảng 15% thời gian). Tuy nhiên, phương thức thứ hai chỉ trả về phần cuối của URL. Điều này có nghĩa là nếu cửa hàng sử dụng danh mục trong URL, nó sẽ không hoạt động, vì phần đó không được hiển thị. Đây là trường hợp trong cửa hàng tôi đang làm việc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.