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?


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());

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.


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.