Answers:
有趣的是,我们是否可以在不加载整个产品的情况下获得产品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
这样您以后可以获取产品网址,这也可以将类别ID作为参数,否则,该网址将不包含类别。
您仍然最终会调用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的方法。由于我在慢速的服务器上工作,因此我需要找到最快的加载方法。
第一种方法:
首先获得的是基于产品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]"
第二种方法:
使用Kalpesh Metha方法的第二种方法是以下代码:
Mage::getResourceSingleton('catalog/product')
->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());
// returns string "product-url-like-this"
对于此方法,可以使用'url_key'
或'url_path'
。我还没有发现区别。
方法之间的区别:
第一种方法花费的时间略多(大约多出15%的时间)。但是,第二种方法仅返回URL的最后部分。这意味着,如果商店在URL中使用类别,则该商店将不起作用,因为该部分未显示。我正在工作的商店就是这种情况。