11

在 Magento 中,我们现在拥有的是单个产品页面上的面包屑总是根据用户到达页面的方式而变化。例如,如果用户从顶级类别一直点击到子类别再到产品,则面包屑将类似于“首页>>顶级类别>>子类别>>产品”。

但是,如果用户直接到达产品页面,例如来自 Google 查询,则面包屑将只是“主页 >> 产品”。像这样是不酷的。

即使用户从谷歌到达页面,通过在面包屑中添加类别肯定会改善用户体验。而且它肯定会增加每次访问的 PV,因为用户可能会点击面包屑中的父类别。

那么有什么方法可以让它保持一致并始终在产品页面上显示类别路径?

我的想法是编辑 page/html/breadcrumbs.phtml 但我不知道如何仅在产品页面上向面包屑添加类别。

任何帮助,将不胜感激!

=======================================

编辑:总之,无论用户如何到达产品页面,我都希望类别出现在产品页面的面包屑中。不管是哪个类别,只要类别在那里。

有人知道吗?这有那么难吗?

在我的脑海中,我需要编辑面包屑模板并在其中注入类别(如果没有的话)并且它是产品页面....但我不知道怎么做,我似乎做不到在任何地方找到任何相关的解决方案......

4

6 回答 6

16

用这个替换“app/code/core/Mage/Page/Block/Html/Breadcrumbs.php”中的_toHtml()函数。

protected function _toHtml() {             

   $cat_id = "";

   if (Mage::registry('current_product')) {
      $product_id = Mage::registry('current_product')->getId();
      $obj = Mage::getModel('catalog/product');
      $_product = $obj->load($product_id); // Enter your Product Id in $product_id

      if ($product_id) {
         $categoryIds = $_product->getCategoryIds();
         $cat_id = $categoryIds[0];
      }

      $category = Mage::getModel('catalog/category')->load($cat_id);
      $cat_name = $category->getName();
      $cat_url =  $this->getBaseUrl().$category->getUrlPath();
   }

   if (is_array($this->_crumbs)) {
      reset($this->_crumbs);
      $this->_crumbs[key($this->_crumbs)]['first'] = true;
      end($this->_crumbs);
      $this->_crumbs[key($this->_crumbs)]['last'] = true;
   }

   if($cat_id) {
      $this->_crumbs['category'.$cat_id] = array('label'=>$cat_name, 'title'=>'', 'link'=>$cat_url,'first'=>'','last'=>'','readonly'=>'');
      ksort($this->_crumbs);
      $home = $this->_crumbs['home'];
      unset($this->_crumbs['home']);
      array_unshift($this->_crumbs,$home);
   }

   $this->assign('crumbs', $this->_crumbs);
   return parent::_toHtml();
}
于 2012-10-04T12:33:21.237 回答
3

您可以重写产品模型以更改 getProductUrl 方法。基本上获取该产品的第一个类别并在产品路径之前附加类别路径。

于 2012-09-25T12:14:15.810 回答
2

我完全理解你想要做什么,我注意到即使是从 Magento 自己的搜索链接的产品也会失去它的类别面包屑。我同意 Slayer,我只会为产品页面实现您自己的自定义块。

您可以使用以下代码检索产品类别树。我已经使用只有一个类别层次结构和具有多个类别层次结构的产品对此进行了测试(在 Magento CE 1.7.0.2 中)。

注意:您可能需要对这段代码做一些工作,因为它将每个类别对象加载到一个数组中,这可能会占用大量内存。我建议只将所需的信息添加到关联数组中,然后将该数组添加到主数组

$productCategories = array();

// grab the products category id array...we only want one, so grab the first one
$categoryIds = $_product->getCategoryIds();
$categoryId = $categoryIds[0];

// we don't want the root category as the name may not be user friendly
while ($categoryId != Mage::app()->getStore()->getRootCategoryId())
{
    // load the category object and add it to the product categories array
    $currentCategory = Mage::getModel('catalog/category')->load($categoryId);
    $productCategories[] = $currentCategory;
}

// as the categories were added in reverse order we'll need to "unreverse" them
foreach (array_reverse($productCategories) as $category)
{
    echo $category->getName().'/';
}
于 2012-09-25T09:45:16.563 回答
2

为此,您可以使用https://github.com/fascinosum/SeoBreadcrumbs之类的轻量级扩展。请注意,已经实施了逻辑来获取分配产品的最低级别类别。您可以根据需要轻松更改此行为。

于 2017-08-06T10:45:32.673 回答
1

找到app/code/core/Mage/Catalog/Helper/Data.php并将Data.php复制到app/code/local/Mage/Catalog/Helper/Data.php 找到函数public function getBreadcrumbPath(),添加如下代码这个函数的开始

    if ($this->getProduct() && !$this->getCategory()) {
       $_categoryIds = $this->getProduct()->getCategoryIds();

       if ($_categoryId = $_categoryIds[0]) {
          $_category = Mage::getModel('catalog/category')-    >load($_categoryId);
          Mage::register('current_category', $_category);
       }

     } 
于 2015-09-22T01:52:26.257 回答
0

@ jacek_podwysocki发布了一个解决方案,将一个片段添加到 breadcrumbs.phtml 并且它有效。

有关代码,请参见此处:在 Magento 中以编程方式添加面包屑路径?

只需将此代码段添加到 app/design/frontend/default/template_name/template/page/html/breadcrumbs.phtml 的顶部

根据 microtime(),添加的页面加载/PHP 渲染时间仅为 0.05 秒。

于 2012-10-03T02:08:56.490 回答