Ottieni l'URL del prodotto dall'id


27

Qual è il modo più efficiente per ottenere l'URL di un prodotto dato solo il suo ID? In alcuni punti del nostro codice abbiamo cose come Mage::getModel('catalog/product')->load($id)->getProductUrl()per ottenere l'URL del prodotto, data la quantità di eventi ecc. Associati a un prodotto che sembra piuttosto dispendioso, esiste un metodo più semplice? La possibilità di specificare anche un ID categoria sarebbe buona.

Inoltre, esiste un metodo efficiente per fare la stessa cosa per un singolo attributo per un prodotto come il nome?


1
la tua domanda è stata risolta qui? Hai bisogno di ulteriore aiuto su questa domanda? In tal caso, facci sapere cosa è necessario fare per aiutarti a trovare una soluzione.
Filwinkle,

Risposte:


47

Interessante sapere se possiamo ottenere l'URL del prodotto senza caricare l'intero prodotto. Mi dispiace rispondere alla tua domanda aggiuntiva e non alla domanda principale, in quanto non sono sicuro di poterlo ottenere :)

Per ottenere un singolo attributo senza caricare l'intero prodotto, è possibile utilizzare getAttributeRawValue()se si utilizza Magento CE versione 1.6+

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

Secondo il commento di @ philwinkle di seguito, ecco un codice più ottimizzato:

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

AGGIORNAMENTO: ottieni l'URL del prodotto per ID senza caricare l'intero prodotto:

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

8
Wowzers. Non lo sapevo! Tutti hanno votato per questa risposta. Se vuoi davvero aumentare l'ante, puoi riutilizzare un modello di risorsa catalogo / prodotto esistente (invece di crearne uno nuovo) chiamando getResourceSingletoninvece. $ storeId non deve essere un ID, può essere anche un Mage_Core_Model_Storeoggetto, quindi puoi usare Mage::app()->getStore()inline per velocizzare le cose.
Filwinkle,

E puoi usarlo per recuperare più attributi: @param int | string | array $ attributo ID o codici di atrribute (in 1.7)
Richard

Mi piace questo approccio, molto pulito. Ho votato a favore. Accetterò se nessuno fornisce una risposta all'URL.
Peter O'Callaghan,

Può ancora essere utilizzato senza un ID prodotto? Se ho solo uno SKU, sono costretto a caricare il modello?
pspahn,

1
Si noti che nel caso in cui ci sia più di un prodotto con lo stesso url_keyquesto potrebbe non funzionare perché Magento creerà un URL diverso da riscrivere da url_key
Fra

11

Penso che sarebbe utile farlo tramite una raccolta. Se non sono necessarie le informazioni complete sul prodotto, è possibile caricarle tramite una raccolta e quindi caricare solo le informazioni necessarie. Il codice sarebbe il seguente.

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

Nota: in addUrlRewritemodo da poter ottenere l'URL del prodotto in un secondo momento, questo può anche prendere un ID categoria come parametro, senza che l'URL non contenga la categoria.

Stai ancora finendo per chiamare quello getProductUrl()che finisce per usare Mage_Catalog_Model_Product_Url, ma questo richiede solo l'id, request_path e la chiave url, quindi dovrebbe funzionare senza il prodotto completo.


Questo funziona bene!
Mukesh Chapagain,

Sembrerebbe che $ Product-> getProductUrl () dovrebbe essere tutto ciò di cui hai bisogno. L'aggiunta "addUrlRewrite ()" fa la differenza, grazie per aver fornito questo esempio.
jschrab,

4

Immagino che il modo più efficace per ottenere l'URL riscritto di un prodotto (senza caricare il prodotto) sia guardare direttamente l'URL di riscrittura di talbe.

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

Per ottenere il percorso completo della categoria, utilizzare

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

Modifica: testato per "url_key", per altri attributi getAttributeRawValuedovrebbe adattarsi.

  1. getRequestPathByIdPath

    • Totale incl. Wall Time (microsec): 8.323 microsec
    • Totale incl. CPU (microsec): 8.038 microsec
    • Totale incl. MemUse (byte): 273.872 byte
    • Totale incl. PeakMemUse (byte): 213.488 byte
    • Numero di chiamate di funzione: 372
  2. getAttributeRawValue

    • Totale incl. Wall Time (microsec): 51.213 microsecs
    • Totale incl. CPU (microsec): 50.390 microsec
    • Totale incl. MemUse (byte): 1.223.520 byte
    • Totale incl. PeakMemUse (byte): 1.168.496 byte
    • Numero di chiamate di funzione: 2.233
  3. load(productId)

    • Totale incl. Wall Time (microsec): 605.649 microsec
    • Totale incl. CPU (microsec): 598.820 microsec
    • Totale incl. MemUse (byte): 5.370.848 byte
    • Totale incl. PeakMemUse (byte): 5.314.384 byte
    • Numero di chiamate di funzione: 27.774

3

Ho trovato questa domanda, chiedendomi lo stesso. E nel caso in cui qualcun altro ne abbia bisogno prima o poi, posterò qui i miei risultati.

Ho trovato due metodi per ottenere l'URL del prodotto senza caricare il prodotto completo. Dato che stavo lavorando su un server lento, avevo bisogno di trovare il metodo di caricamento più veloce.

Il primo metodo:

Il primo get è una raccolta di prodotti basata sull'ID prodotto:

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

Il secondo metodo:

Il secondo metodo, usando il metodo di Kalpesh Metha, sarebbe questo codice:

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

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

Per questo metodo, puoi usare 'url_key'o 'url_path'. Non ho scoperto la differenza però.

La differenza tra i metodi:

Il primo metodo richiede un po 'più di tempo (circa il 15% di tempo in più). Il secondo metodo, tuttavia, restituisce solo la parte finale dell'URL. Ciò significa che se il negozio utilizza la categoria nell'URL, non funzionerà, poiché quella parte non viene mostrata. Questo era il caso nel negozio a cui stavo lavorando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.