Эффективно получить URL продукта от id

27

Каков наиболее эффективный способ получения URL-адреса продукта только по его идентификатору? В некоторых местах нашего кода есть такие вещи, как, например 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 продукта по идентификатору без загрузки всего продукта:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());
Kalpesh
источник
8
Wowzers. Не знал об этом! Все приветствуют этот ответ. Если вы действительно хотите повысить ставку, вы можете повторно использовать существующую модель ресурсов каталога / продукта (вместо создания новой), вызывая getResourceSingletonвместо этого. $ storeId не обязательно должен быть идентификатором, он также может быть Mage_Core_Model_Storeобъектом, так что вы можете использовать Mage::app()->getStore()inline, чтобы ускорить процесс.
Philwinkle
И вы можете использовать его для извлечения нескольких атрибутов: @param int | string | array $ attribute идентификаторы или коды атрибутов (в 1.7)
Ричард,
Мне нравится такой подход, очень аккуратный. Я проголосовал за. Я приму, если никто не придет с ответом на URL.
Питер О'Каллаган
Можно ли это использовать без идентификатора продукта? Если у меня есть только SKU, я вынужден загрузить модель?
pspahn
1
Обратите внимание, что в случае, когда существует более одного продукта с таким же, url_keyэто может не сработать, потому что magento создаст другую перезапись 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, но для этого нужны только идентификатор, request_path и ключ url, поэтому он должен работать без полного продукта.

Дэвид Мэннерс
источник
Это работает хорошо!
Мукеш Чапагайн
Казалось бы, $ Product-> getProductUrl () должно быть всем, что вам нужно. Добавление addUrlRewrite () имеет значение - спасибо за предоставленный пример.
января
4

Я полагаю, что наиболее эффективный способ получить переписанный URL-адрес продукта (без загрузки продукта) - это посмотреть непосредственно на перезапись URL-адреса talbe.

# 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

    • Всего вкл. Время стены (мкс): 8323 мксек
    • Всего вкл. ЦП (микросекунд): 8,038 микросекунд
    • Всего вкл. MemUse (байты): 273 872 байта
    • Всего вкл. PeakMemUse (байты): 213 488 байтов
    • Количество функциональных вызовов: 372
  2. getAttributeRawValue

    • Всего вкл. Время стены (мкс): 51 213 мксек
    • Всего вкл. ЦП (микросекунд): 50,390 микросекунд
    • Всего вкл. MemUse (байты): 1 223 520 байтов
    • Всего вкл. PeakMemUse (байты): 1 168 496 байтов
    • Количество функциональных вызовов: 2,233
  3. load(productId)

    • Всего вкл. Время стены (мкс): 605 649 мксек
    • Всего вкл. ЦП (микросекунд): 598 820 микросекунд
    • Всего вкл. MemUse (байты): 5,370,848 байтов
    • Всего вкл. PeakMemUse (байты): 5 314 384 байта
    • Количество функциональных вызовов: 27 774
sv3n
источник
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-адресе, он не будет работать, поскольку эта часть не отображается. Это был случай в магазине, над которым я работал.

Сандер Коедуд
источник