3

我被困在产品集合中获取产品网址。我有这段代码来获取设置的特色产品的产品集合。

 $_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/category/subcategory/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/category/subcategory.html/itemname.html

子类别名称中包含 .html。我的 url 中不需要 .html,因此单击该项目时会重定向到正确的页面。

有什么想法可以解决这个问题吗?

4

5 回答 5

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() // 变魔术

于 2014-01-08T16:03:36.187 回答
4

这样做的问题是产品可以出现在多个类别中。

因此,在某种程度上,无论您采用哪种方式,您都必须在某个地方涉及一个类别。

因此,最简洁的方法是使用该addurlRewrite方法并传递类别 ID。Magento 将检查与类别 id 和产品 id 匹配的重写 - 如果找到重写,您将在getProductUrl 调用中获得您正在寻找的漂亮 url。例如,使用 10 的类别 ID:

$collection = Mage::getResourceModel('catalog/product_collection')
                ->addUrlRewrite(10);

如果您知道每个产品只会出现在一个类别中,那么您可以通过使用以下获取第一个类别 id 来使其更加灵活:

因此,使用此方法的完整示例将是:

$categoryId = array_shift($_product->getCategoryIds());
$collection = Mage::getResourceModel('catalog/product_collection')
                ->addUrlRewrite($categoryId);
于 2012-06-12T15:13:04.097 回答
1

这是预期的行为,因为相同的产品可以存在于多个类别中。

于 2012-06-12T14:32:06.980 回答
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()); 
于 2013-07-27T07:23:24.533 回答
-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()); 
 }  

我只是在类别 url 路径中分解 .html,因为我希望我的类别 url 在其中包含 .html。

我不知道这是否很好解决,但这对我有用。

于 2012-06-12T14:54:54.980 回答