Eficiente obtener URL del producto desde la identificación

27

¿Cuál es la forma más eficiente de obtener una URL de producto dada su ID? En algunos lugares de nuestro código tenemos cosas como, por ejemplo Mage::getModel('catalog/product')->load($id)->getProductUrl(), para obtener la URL del producto, dada la cantidad de eventos, etc. asociados con un producto, esto parece un desperdicio, ¿existe un método más simple? La capacidad de especificar también una identificación de categoría sería buena.

Además, ¿existe un método eficiente para hacer lo mismo para un solo atributo de un producto como el nombre?

Peter O'Callaghan
fuente
1
¿Su pregunta se resolvió aquí? ¿Necesitabas más ayuda sobre esta pregunta? Si es así, infórmenos qué debe hacerse para ayudarlo a encontrar una solución.
philwinkle

Respuestas:

47

Es interesante saber si podemos obtener la URL del producto sin cargar el producto completo. Lamento responder su pregunta adicional y no la pregunta principal, ya que tampoco estoy seguro de si podemos obtenerla :)

Para obtener un solo atributo sin cargar el producto completo, puede usarlo getAttributeRawValue()si está usando Magento CE versión 1.6+

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

Según el comentario de @ philwinkle a continuación, aquí hay un código más optimizado:

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

ACTUALIZACIÓN: Obtenga la URL del producto por ID sin cargar el producto completo:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());
Kalpesh
fuente
8
Wowzers ¡No sabía sobre eso! Todos votaron esta respuesta. Si realmente desea aumentar la apuesta, puede reutilizar un modelo de catálogo / recurso de producto existente (en lugar de crear una instancia nueva) llamando en su getResourceSingletonlugar. $ storeId no tiene que ser una identificación, también puede ser un Mage_Core_Model_Storeobjeto, por lo que puede usar en Mage::app()->getStore()línea para acelerar las cosas.
philwinkle
Y puede usarlo para obtener múltiples atributos: @param int | string | array $ attribute atrribute's identificadores o códigos (en 1.7)
Richard
Me gusta este enfoque, muy ordenado. He votado a favor. Aceptaré si a nadie se le ocurre una respuesta a la URL.
Peter O'Callaghan
¿Todavía se puede usar sin una identificación de producto? Si solo tengo un SKU, ¿me veo obligado a cargar el modelo?
pspahn
1
Tenga en cuenta que en caso de que haya más de un producto con el mismo, url_keyesto puede no funcionar porque Magento creará una reescritura de url diferente de la url_key
Fra
11

Creo que sería beneficioso hacer esto a través de una colección. Si no necesita la información completa del producto, puede cargarla a través de una colección y, por lo tanto, solo cargar la información que necesita. El código sería el siguiente.

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

Nota: addUrlRewritepara que pueda obtener la URL del producto más adelante, esto también puede tomar un ID de categoría como parámetro, sin esto la URL no contendría la categoría.

Todavía terminas llamando al getProductUrl()que termina usando Mage_Catalog_Model_Product_Url, pero esto solo necesita el id, request_path y la clave de url, por lo que debería funcionar sin el producto completo.

David modales
fuente
Esto funciona bien!
Mukesh Chapagain
Parece que $ Product-> getProductUrl () debería ser todo lo que necesita. La adición "addUrlRewrite ()" hace la diferencia, gracias por proporcionar ese ejemplo.
jschrab
4

Supongo que la forma más eficiente de obtener una URL reescrita de productos (sin cargar el producto) es mirar directamente en el talbe de reescritura de URL.

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

Para obtener la ruta de categoría completa, use

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

Editar: probado para "url_key", para otros atributos getAttributeRawValuedebe encajar.

  1. getRequestPathByIdPath

    • Total incl. Tiempo de pared (microsec): 8,323 microsecs
    • Total incl. CPU (microsecs): 8,038 microsecs
    • Total incl. MemUse (bytes): 273,872 bytes
    • Total incl. PeakMemUse (bytes): 213,488 bytes
    • Número de llamadas a funciones: 372
  2. getAttributeRawValue

    • Total incl. Tiempo de pared (microsec): 51,213 microsecs
    • Total incl. CPU (microsecs): 50,390 microsecs
    • Total incl. MemUse (bytes): 1,223,520 bytes
    • Total incl. PeakMemUse (bytes): 1,168,496 bytes
    • Número de llamadas a funciones: 2,233
  3. load(productId)

    • Total incl. Tiempo de pared (microsec): 605,649 microsecs
    • Total incl. CPU (microsecs): 598,820 microsecs
    • Total incl. MemUse (bytes): 5,370,848 bytes
    • Total incl. PeakMemUse (bytes): 5,314,384 bytes
    • Número de llamadas a funciones: 27,774
sv3n
fuente
3

Encontré esta pregunta, preguntándome lo mismo. Y en caso de que alguien más necesite esto alguna vez, publicaré mis propios hallazgos aquí.

Encontré dos métodos para obtener la URL del producto sin cargar el producto completo. Como estaba trabajando en un servidor lento, necesitaba encontrar el método de carga más rápido.

El primer método:

El primero es una colección de productos basada en la identificación del producto:

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

El segundo método:

El segundo método, usando el método de Kalpesh Metha, sería este código:

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

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

Para este método, puede usar 'url_key'o 'url_path'. Sin embargo, no he descubierto la diferencia.

La diferencia entre los métodos:

El primer método lleva un poco más de tiempo (aproximadamente 15% de tiempo extra). Sin embargo, el segundo método solo devuelve la parte final de la URL. Esto significa que si la tienda usa la categoría en la URL, no funcionará, ya que esa parte no se muestra. Este fue el caso en la tienda en la que estaba trabajando.

Sander Koedood
fuente