$ _product-> getProductUrl()提供不带URL密钥的URL路径


15

我在几个不同的Magento网站的页面上都得到了某个类别的产品集合。我获取收藏的代码是:

        $category = new Mage_Catalog_Model_Category();
        $category->load($id);
        $collection = $category->getProductCollection();
        $collection->addAttributeToSelect('*');
        $collection->addAttributeToFilter('status', 1);
        $collection->addFieldToFilter(array(array('attribute'=>'visibility', 'neq'=>"1" )));
        $collection->getSelect()->limit(12);

        foreach ($collection as $shopProduct) :

            echo $shopProduct->getProductUrl();

        endforeach;

我的问题是,在我们正在运行的Magento站点之一上,ProductUrl()被抓取的网址是,http://www.my site.com/catalog/product/view/id/2309/s/shopcat/category/373/而不是http://www.site.com/shopcat/product-url-key.html。但是,在所有其他网站上,它都可以按照我们的意愿出现。

有谁知道为什么会这样吗?谢谢!我也尝试使用,getUrlPath()但这没有返回任何内容。我知道我可以通过做类似的事情来解决这个问题,<?php echo $this->getBaseUrl().$shopProduct->getUrlKey().".html"; ?>但是这种方法似乎效率不高!

编辑21/03/14:我仍然有这个问题。我已经意识到getProductUrl()可以在网站的某些模板文件上检索所需的URL,但不能在其他文件上检索。例如,我在首页上加载了一个收藏集,并且给了我想要的URL。但是getProductUrl()没有在类别视图中用相同的代码提供我想要的URL。


您是否尝试重新索引“索引URL重写”?
oleksii.svarychevskyi 2014年

是,请为您的数据
重新索引

我都尝试过。我已经在索引管理中重新建立了索引,并且刷新了缓存,但是无论如何都禁用了缓存。
莎拉

输入admin-> catalof-> URL重写管理。是否有网址重排?如果是,请尝试过滤网格:Target path-> [category / some_category_id]
mageUz 2014年

非常抱歉延迟回复。有针对该产品的URL重写设置,因此,如果您访问site.com/shopcat/product-url-key.htmlsite.com/catalog/product/view/id/2309/s/shopcat/ category / 373您仍然可以访问相同的产品页面,只是由于某种原因,foreach循环正在拉入错误的URL类型。
莎拉

Answers:


18

尝试获取这样的集合:

$collection = $category->getProductCollection();
$collection->addAttributeToSelect('*');
$collection->addAttributeToFilter('status', 1);
$collection->addFieldToFilter(array(array('attribute'=>'visibility', 'neq'=>"1" )));
//Where the magic happens
//this will add the url rewrite.
//addUrlRewrite can also be left without a parameter to generate url without category.
$collection->addUrlRewrite($category->getId()); 
$collection->getSelect()->limit(12);

换句话说,让模型知道提供url键,而不是使用来代替冗长的url $collection->addUrlRewrite();


问题-为什么在addUrlRewrite中需要$ category-> getId()?我看到它无论哪种方式都可以工作(例如,即使没有)。谢谢!
Ronen Ness

2
@Ness,您好,这取决于您在系统/配置/目录/目录/搜索引擎优化中是否具有“使用产品URL的类别路径”。如果不这样做,则可以忽略它,而只需使用addUrlRewrite()。如果您打开了类别路径,则将类别ID传递到函数中意味着所呈现的产品URL是类别路径前面的产品URL。
莎拉

@Marius是的,它对我有用。
Dhara Bhatti

8

获取产品URL

由于您可以使用3种方法,因此可能会造成混淆,所有这些方法都在Mage_Catalog_Model_Product中:

public function getUrlPath($category=null)
public function getUrlInStore($params = array())
public function getProductUrl($useSid = null)

最好的解释方法是简单地显示几个调用的结果。给定一个产品的URL密钥在http://made.local域上为mondrian -large-coffee-table-set-multicolour,结果为:

$product->getUrlPath();
    'mondrian-large-coffee-table-set-multicolour'

$product->getUrlPath($category);
    'tables/mondrian-large-coffee-table-set-multicolour'

// you cannot stop this method adding ___store to the URL, even by setting _store_to_url to false
$product->getUrlInStore();
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour?___store=default'

// you cannot stop this method adding ___store to the URL, even by setting _store_to_url to false
// note - see the "using _ignore_category" section below for an arguable bug with using this param
$product->getUrlInStore(array('_ignore_category' => true));
    'http://made.local/mondrian-large-coffee-table-set-multicolour?___store=default'

$product->getProductUrl();
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

$product->getProductUrl(true);
    'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'
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.