Obter URL do produto eficiente a partir do ID

27

Qual é a maneira mais eficiente de obter um URL de produto, apenas com seu ID? Em alguns lugares do nosso código, temos coisas como Mage::getModel('catalog/product')->load($id)->getProductUrl()obter o URL do produto, dada a quantidade de eventos, etc. associados a um produto, isso parece um desperdício, existe um método mais simples? A capacidade de também especificar um ID de categoria seria boa.

Além disso, existe um método eficiente para fazer a mesma coisa para um único atributo para um produto como nome?

Peter O'Callaghan
fonte
11
sua pergunta foi resolvida aqui? Você precisou de mais ajuda sobre esta questão? Nesse caso, informe-nos o que precisa ser feito para ajudá-lo a encontrar uma solução.
philwinkle

Respostas:

47

Interessante saber se podemos obter o URL do produto sem carregar o produto inteiro. Lamento responder à sua pergunta adicional e não à pergunta principal, pois também não tenho certeza se podemos obtê-lo :)

Para obter um único atributo sem carregar o produto inteiro, você pode usar getAttributeRawValue()se estiver usando o Magento CE versão 1.6+

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

Conforme o comentário de @ philwinkle abaixo, aqui está o código mais otimizado:

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

ATUALIZAÇÃO: obtenha o URL do produto por ID sem carregar o produto inteiro:

Mage::getResourceSingleton('catalog/product')
  ->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());
Kalpesh
fonte
8
Wowzers. Não sabia sobre isso! Todo mundo votou nessa resposta. Se você realmente deseja aumentar a aposta, pode reutilizar um modelo de catálogo / recurso de produto existente (em vez de instanciar um novo) chamando getResourceSingleton. $ storeId não precisa ser um ID, também pode ser um Mage_Core_Model_Storeobjeto, para que você possa usar o Mage::app()->getStore()inline para acelerar as coisas.
philwinkle
And you can use it to fetch multiple attributes: @param int|string|array $attribute atrribute's ids or codes (in 1.7)
Richard
Eu gosto dessa abordagem, muito elegante. Eu votei para cima. Aceito se ninguém encontrar uma resposta para o URL.
Peter O'Callaghan
Ainda pode ser usado sem um ID do produto? Se eu tiver apenas um SKU, sou obrigado a carregar o modelo?
Pspahn 20/05
11
Note-se que no caso de haver mais do que um produto com o mesmo url_keyisso pode não funcionar porque Magento vai criar uma reescrita url diferente do url_key
Fra
11

Eu acho que seria benéfico fazer isso através de uma coleção. Se você não precisar das informações completas do produto, poderá carregá-las por meio de uma coleção e, portanto, carregar apenas as informações necessárias. O código seria o seguinte.

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

Nota: addUrlRewritepara que você possa obter o URL do produto posteriormente, também pode usar um ID de categoria como parâmetro, sem isso o URL não conteria a categoria.

Você ainda está chamando o getProductUrl()que acaba usando Mage_Catalog_Model_Product_Url, mas isso só precisa do id, request_path e da chave da URL, para que funcione sem o produto completo.

David Manners
fonte
Isso funciona bem!
Mukesh Chapagain 27/03
Parece que $ Product-> getProductUrl () deve ser tudo o que você precisa. A adição "addUrlRewrite ()" faz a diferença - obrigado por fornecer esse exemplo.
Jschrab
4

Eu acho que a maneira mais eficaz de obter uma URL reescrita de produtos (sem carregar o produto) é olhar diretamente no URL de reescrita de URL.

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

Para obter o caminho completo da categoria, use

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

Edit: testado para "url_key", pois outros atributos getAttributeRawValuedevem caber.

  1. getRequestPathByIdPath

    • Total Incl. Tempo de parede (microseg): 8.323 microssegundos
    • Total Incl. CPU (microssegundos): 8.038 microssegundos
    • Total Incl. MemUse (bytes): 273.872 bytes
    • Total Incl. PeakMemUse (bytes): 213.488 bytes
    • Número de chamadas de função: 372
  2. getAttributeRawValue

    • Total Incl. Tempo de parede (microsseguro): 51.213 microssegundos
    • Total Incl. CPU (microssegundos): 50.390 microssegundos
    • Total Incl. MemUse (bytes): 1.223.520 bytes
    • Total Incl. PeakMemUse (bytes): 1.168.496 bytes
    • Número de chamadas de função: 2,233
  3. load(productId)

    • Total Incl. Tempo de parede (microsseguro): 605.649 microssegundos
    • Total Incl. CPU (microssegundos): 598.820 microssegundos
    • Total Incl. MemUse (bytes): 5,370,848 bytes
    • Total Incl. PeakMemUse (bytes): 5,314,384 bytes
    • Número de chamadas de função: 27.774
sv3n
fonte
3

Eu encontrei essa pergunta, imaginando o mesmo. E, caso alguém precise disso em algum momento, postarei minhas próprias descobertas aqui.

Encontrei dois métodos para obter o URL do produto sem carregar o produto completo. Como eu estava trabalhando em um servidor lento, precisava encontrar o método de carregamento mais rápido.

O primeiro método:

A primeira é uma coleção de produtos com base no ID do produto:

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

O segundo método:

O segundo método, usando o método de Kalpesh Metha, seria este código:

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

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

Para esse método, você pode usar 'url_key'ou 'url_path'. Ainda não descobri a diferença.

A diferença entre os métodos:

O primeiro método leva um pouco mais de tempo (cerca de 15% de tempo extra). O segundo método, no entanto, retorna apenas a parte final do URL. Isso significa que, se a loja usar a categoria no URL, ela não funcionará, pois essa parte não será exibida. Este era o caso na loja em que eu estava trabalhando.

Sander Koedood
fonte