IDのみを指定して製品のURLを取得する最も効率的な方法は何ですか?コードのいくつかの場所にMage::getModel('catalog/product')->load($id)->getProductUrl()
は、製品のURLを取得するため、製品に関連するイベントの量などを考えると、これはかなり無駄に思えますが、もっと簡単な方法はありますか?カテゴリIDも指定できると便利です。
さらに、名前などの製品の単一の属性に対して同じことを行うための効率的な方法はありますか?
IDのみを指定して製品のURLを取得する最も効率的な方法は何ですか?コードのいくつかの場所にMage::getModel('catalog/product')->load($id)->getProductUrl()
は、製品のURLを取得するため、製品に関連するイベントの量などを考えると、これはかなり無駄に思えますが、もっと簡単な方法はありますか?カテゴリIDも指定できると便利です。
さらに、名前などの製品の単一の属性に対して同じことを行うための効率的な方法はありますか?
回答:
製品全体をロードせずに製品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());
getResourceSingleton
。$ storeIdはIDである必要はありません。Mage_Core_Model_Store
オブジェクトである場合もあるため、Mage::app()->getStore()
インラインを使用して速度を上げることができます。
url_key
Magentoのつもりがurl_key異なるURL書き換えを作成するので、これは動作しない場合があります
コレクションを介してこれを行うことは有益だと思います。完全な製品情報が必要ない場合は、コレクションを介してロードできるため、必要な情報のみをロードできます。コードは次のようになります。
$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キーのみが必要なので、完全な製品がなくても機能します。
製品を書き換えた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
が適合するはずです。
getRequestPathByIdPath
getAttributeRawValue
load(productId)
私は同じ疑問に思ってこの質問を見つけました。そして、誰かがいつかこれを必要とする場合に備えて、私自身の発見をここに投稿します。
製品全体をロードせずに製品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でカテゴリを使用している場合、その部分が表示されないため機能しないことを意味します。これは私が働いていた店の場合でした。