有效地从ID获取产品网址


27

仅给出ID,获得产品网址的最有效方法是什么?在代码的某些地方,我们有一些东西,例如Mage::getModel('catalog/product')->load($id)->getProductUrl()获取产品的URL,鉴于与产品相关的事件数量等等,这似乎很浪费,有没有更简单的方法?还可以指定类别ID的功能很好。

另外,是否有一种有效的方法对商品(例如名称)的单个属性执行相同的操作?


1
您的问题在这里解决了吗?您是否需要有关此问题的更多帮助?如果是这样,请告诉我们需要做什么来帮助您找到解决方案。
philwinkle

Answers:


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
Wowzers。不知道那一个!每个人都支持这个答案。如果您真的想提高赌注,则可以通过调用getResourceSingleton来重用现有的目录/产品资源模型(而不是实例化新模型)。$ storeId不必是id,它也可以是Mage_Core_Model_Store对象,因此您可以使用Mage::app()->getStore()内联来加快处理速度。
philwinkle

而且您可以使用它来获取多个属性:@param int | string | array $ attribute atrribute的ID或代码(在1.7版中)
理查德

我喜欢这种方法,非常简洁。我投票了。如果没有人提供URL答案,我将接受。
彼得·奥卡拉汉

没有产品ID仍可以使用吗?如果我只有SKU,是否需要加载模型?
pspahn

1
请注意,如果有多个相同的产品,则url_key可能无法正常工作,因为magento将创建与url_key不同的url重写
Fra

11

我认为通过收藏进行此操作将是有益的。如果您不需要完整的产品信息,则可以通过集合加载它,因此仅加载所需的信息。代码如下。

$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键,因此它不需要完整的产品就可以工作。


这很好!
Mukesh Chapagain 2014年

似乎$ Product-> getProductUrl()应该就是您所需要的。“ addUrlRewrite()”附加项有所不同-感谢您提供了该示例。
jschrab '16

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的方法。由于我在慢速的服务器上工作,因此我需要找到最快的加载方法。

第一种方法:

首先获得的是基于产品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中使用类别,则该商店将不起作用,因为该部分未显示。我正在工作的商店就是这种情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.