我坚持在产品系列中获取产品网址。我有这些代码来获取已设置的特色产品的产品系列。
$_productCollection = Mage::getModel('catalog/product')
->setStoreId(Mage::app()->getStore()->getId())
->getCollection();
$_productCollection->addAttributeToFilter('feat_enabled', 1);
$_productCollection->setVisibility(array(2,3,4));
$_productCollection->addUrlRewrite();
$_productCollection->groupByAttribute('entity_id');
$_productCollection->load();
foreach($_productCollection as $_product){
$_product->load($_product->getId());
if($_product->getIsSalable()){
$_name = ltrim(rtrim($_product->getName()));
$_url = $_product->getProductUrl();
}
}
我在这里做错了什么,如果在每个循环中回显$ _url,则返回的url缺失。它没有类别名称和子目录名称。正确的网址应该是:
的index.php /类别/子类别/ itemname.html
但目前只返回
index.php/itemname.html
它返回纠正除url之外的数据。如果我将项目分配到一个类别和子类别,我会在管理员中进行双重检查,我确认我已将其分配。
Upon further research, I have found the code below that is very close to what i need.
$_categories = $_product->getCategoryIds();
$_category = Mage::getModel('catalog/category')->load($_categories[0]);
$_url = Mage::getUrl($_category->getUrlPath()).basename($_product->getProductUrl());
这里的问题,$ _url值变得像这样
的index.php /类别/ subcategory.html / itemname.html
子类别名称中包含.html。我的网址中不需要.html,因此点击时该项目会被重定向到正确的页面。
有什么想法解决这个问题吗?
答案 0 :(得分:7)
$_productCollection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('*')
->addCategoryFilter( $_category )
->addAttributeToFilter('status', array('eq' => 1))
->addUrlRewrite()
->load();
foreach ($_productCollection as $_product):
$_product_url = $_product->getProductUrl();
endforeach;
addUrlRewrite()//做魔术
答案 1 :(得分:4)
问题在于产品可以出现在多个类别中。
因此,在某种程度上,无论您采用哪种方式,都必须在某个地方涉及某个类别。
因此,最简洁的方法是使用addurlRewrite
方法并传递类别ID。 Magento将检查匹配类别ID和产品ID的重写 - 如果找到重写,您将在getProductUr
l呼叫中获得您正在寻找的好网址。例如,使用类别ID为10:
$collection = Mage::getResourceModel('catalog/product_collection')
->addUrlRewrite(10);
如果您知道每个产品只会出现在一个类别中,那么您可以通过使用以下内容获得第一个类别ID来使其更加灵活:
因此,使用此方法的完整示例将是:
$categoryId = array_shift($_product->getCategoryIds());
$collection = Mage::getResourceModel('catalog/product_collection')
->addUrlRewrite($categoryId);
答案 2 :(得分:1)
这是预期的行为,因为相同的产品可以存在于多个类别中。
答案 3 :(得分:0)
感谢您的出色解决方案。 但如果包含根类别和更多深度类别,它将无效。 我在您的解决方案中添加了一些代码:
$cat_count=count($_categories);
if($cat_count>0){
if($_categories[0]==2) // here 2 is root category id
$cat_count=$cat_count-1;
else
$cat_count=$cat_count-2;
}
$_categories = $_product->getCategoryIds();
$_category = Mage::getModel('catalog/category')->load($_categories[$cat_count]);
$caturl=explode('.html', $_category->getUrlPath());
$_url = Mage::getUrl($caturl[0]).basename($_product->getProductUrl());
答案 4 :(得分:-1)
为了那些与我的问题相同的人的利益。我已经通过这种方式解决了这个问题。
foreach($_productCollection as $_product){
$_categories = $_product->getCategoryIds();
$_category = Mage::getModel('catalog/category')->load($_categories[0]);
$caturl=explode('.html', $_category->getUrlPath());
$_url = Mage::getUrl($caturl[0]).basename($_product->getProductUrl());
}
我只是在类别网址路径中爆炸.html,因为我希望我的类别网址中包含.html。
我不知道这是否很好,但这对我有用。