IDから製品URLを効率的に取得


27

IDのみを指定して製品のURLを取得する最も効率的な方法は何ですか?コードのいくつかの場所にMage::getModel('catalog/product')->load($id)->getProductUrl()は、製品のURLを取得するため、製品に関連するイベントの量などを考えると、これはかなり無駄に思えますが、もっと簡単な方法はありますか?カテゴリIDも指定できると便利です。

さらに、名前などの製品の単一の属性に対して同じことを行うための効率的な方法はありますか?


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

更新:製品全体をロードせずにIDで製品URLを取得します。

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

8
ワウザー。それについて知らなかった!誰もがこの答えに賛成です。本当に必要な場合は、代わりに呼び出して、既存のカタログ/製品リソースモデルを(新しいモデルをインスタンス化する代わりに)再利用できますgetResourceSingleton。$ storeIdはIDである必要はありません。Mage_Core_Model_Storeオブジェクトである場合もあるため、Mage::app()->getStore()インラインを使用して速度を上げることができます。
-philwinkle

(1.7)配列$属性atrributeのIDまたはコード|文字列を| @param int型:そして、あなたは複数の属性を取得するためにそれを使用することができます
リチャード・

私はこのアプローチがとても気に入っています。投票しました。誰もURLへの回答を思い付かない場合は受け入れます。
ピーターオキャラハン

製品IDなしでもこれを使用できますか?SKUのみがある場合、モデルをロードする必要がありますか?
pspahn

1
場合にはより多くのと同じで製品よりも、そこにあることに注意してくださいurl_keyMagentoのつもりがurl_key異なるURL書き換えを作成するので、これは動作しない場合があります
フラ

11

コレクションを介してこれを行うことは有益だと思います。完全な製品情報が必要ない場合は、コレクションを介してロードできるため、必要な情報のみをロードできます。コードは次のようになります。

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

注:addUrlRewrite後で製品のURLを取得できるように、これはパラメーターとしてカテゴリーIDを取ることもできます。これがない場合、URLにはカテゴリーが含まれません。

それでもを呼び出すことになりますが、getProductUrl()これはを使用することMage_Catalog_Model_Product_Urlになりますが、これにはid、request_path、およびurlキーのみが必要なので、完全な製品がなくても機能します。


これはうまくいきます!
ムケシュチャパゲイン14年

必要なのは$ Product-> getProductUrl()だけです。「addUrlRewrite()」の追加は違いを生みます-その例を提供してくれてありがとう。
jschrab

4

製品を書き換えたURL 製品の読み込みなし)を取得する最も効率的な方法は、URL書き換えテーブルを直接調べることだと思います。

# 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

    • 合計を含む ウォールタイム(マイクロ秒):8,323マイクロ秒
    • 合計を含む CPU(マイクロ秒):8,038マイクロ秒
    • 合計を含む MemUse(バイト):273,872バイト
    • 合計を含む PeakMemUse(バイト):213,488バイト
    • 関数呼び出しの数:372
  2. getAttributeRawValue

    • 合計を含む ウォールタイム(マイクロ秒):51,213マイクロ秒
    • 合計を含む CPU(マイクロ秒):50,390マイクロ秒
    • 合計を含む MemUse(バイト):1,223,520バイト
    • 合計を含む PeakMemUse(バイト):1,168,496バイト
    • 関数呼び出しの数:2,233
  3. load(productId)

    • 合計を含む ウォールタイム(マイクロ秒):605,649マイクロ秒
    • 合計を含む CPU(マイクロ秒):598,820マイクロ秒
    • 合計を含む MemUse(バイト):5,370,848バイト
    • 合計を含む PeakMemUse(バイト):5,314,384バイト
    • 関数呼び出しの数:27,774

3

私は同じ疑問に思ってこの質問を見つけました。そして、誰かがいつかこれを必要とする場合に備えて、私自身の発見をここに投稿します。

製品全体をロードせずに製品URLを取得する2つの方法を見つけました。遅いサーバーで作業していたので、最速のロード方法を見つける必要がありました。

最初の方法:

最初の取得は、製品IDに基づく製品コレクションです。

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

2番目の方法:

Kalpesh Methaの方法を使用する2番目の方法は、次のコードです。

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

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

この方法では、'url_key'またはを使用できます'url_path'。違いはわかりませんが。

方法の違い:

最初の方法は少し時間がかかります(約15%余分に時間がかかります)。ただし、2番目のメソッドは、URLの最後の部分のみを返します。これは、ショップがURLでカテゴリを使用している場合、その部分が表示されないため機能しないことを意味します。これは私が働いていた店の場合でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.