Get correct Magento multi level categories page title and canonical url

Hello, I noticed there was a problem with the page titles and canonical urls for multi-level categories pages, for example if I have a category like this:

ebook/fiction/general

Magento 1.5.1.0 puts a wrong canonical url like this:

http://example.com/ebook

while it should be:

http://example.com/ebook/fiction/general

So we need a patch to fix this behavior and I will show you below. In the same time I needed to put a page title for category which hasn’t a default one.

If you haven’t write a page title for every category you have, Magento simply places the default store title, but i think this is wrong, because you know SEO is important, and page title is the most important thing on a website.

So I add a correct page title for categories without it by patching the same file for the fix above and you will have a page title with every category level names like this:

<title>Ebook - Fiction - General</title>

that’s much better then the default store title.

How to get all of this? Very simple, just place this code in “app/code/local/Mage/Catalog/Block/Category/View.php” so you will override the default one without touching the core file, and you are done (the function touched is only the _prepareLayout):


<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@magentocommerce.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magentocommerce.com for more information.
*
* @category Mage
* @package Mage_Catalog
* @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/

/**
* Category View block
*
* @category Mage
* @package Mage_Catalog
* @author Magento Core Team <core@magentocommerce.com>
*/
class Mage_Catalog_Block_Category_View extends Mage_Core_Block_Template
{
protected function _prepareLayout()
{
parent::_prepareLayout();

$this->getLayout()->createBlock('catalog/breadcrumbs');

if ($headBlock = $this->getLayout()->getBlock('head')) {
$category = $this->getCurrentCategory();
if ($title = $category->getMetaTitle()) {
$headBlock->setTitle($title);
}

// SBF get categories name as page title
if (!$title ) {

$title = $category->getName();

$it = 5; //Amount of iterations before script gives up

if ($category) {

while($category->getLevel() != 2 &amp;amp;&amp;amp; $it > 0) {
$category = $category->getParentCategory();
$title = $category->getName().' - '.$title;

if (!($category instanceof Mage_Catalog_Model_Category)) {
break;
}
}

}
$headBlock->setTitle($title);
};

if ($description = $category->getMetaDescription()) {
$headBlock->setDescription($description);
}
if ($keywords = $category->getMetaKeywords()) {
$headBlock->setKeywords($keywords);
}
if ($this->helper('catalog/category')->canUseCanonicalTag()) {
// SBF
$headBlock->addLinkRel('canonical', $this->getCurrentCategory()->getUrl());
}
/*
want to show rss feed in the url
*/
if ($this->IsRssCatalogEnable() &amp;amp;&amp;amp; $this->IsTopCategory()) {
$title = $this->helper('rss')->__('%s RSS Feed',$this->getCurrentCategory()->getName());
$headBlock->addItem('rss', $this->getRssLink(), 'title="'.$title.'"');
}
}

return $this;
}

public function IsRssCatalogEnable()
{
return Mage::getStoreConfig('rss/catalog/category');
}

public function IsTopCategory()
{
return $this->getCurrentCategory()->getLevel()==2;
}

public function getRssLink()
{
return Mage::getUrl('rss/catalog/category',array('cid' => $this->getCurrentCategory()->getId(), 'store_id' => Mage::app()->getStore()->getId()));
}

public function getProductListHtml()
{
return $this->getChildHtml('product_list');
}

/**
* Retrieve current category model object
*
* @return Mage_Catalog_Model_Category
*/
public function getCurrentCategory()
{
if (!$this->hasData('current_category')) {
$this->setData('current_category', Mage::registry('current_category'));
}
return $this->getData('current_category');
}

public function getCmsBlockHtml()
{
if (!$this->getData('cms_block_html')) {
$html = $this->getLayout()->createBlock('cms/block')
->setBlockId($this->getCurrentCategory()->getLandingPage())
->toHtml();
$this->setData('cms_block_html', $html);
}
return $this->getData('cms_block_html');
}

/**
* Check if category display mode is "Products Only"
* @return bool
*/
public function isProductMode()
{
return $this->getCurrentCategory()->getDisplayMode()==Mage_Catalog_Model_Category::DM_PRODUCT;
}

/**
* Check if category display mode is "Static Block and Products"
* @return bool
*/
public function isMixedMode()
{
return $this->getCurrentCategory()->getDisplayMode()==Mage_Catalog_Model_Category::DM_MIXED;
}

/**
* Check if category display mode is "Static Block Only"
* For anchor category with applied filter Static Block Only mode not allowed
*
* @return bool
*/
public function isContentMode()
{
$category = $this->getCurrentCategory();
$res = false;
if ($category->getDisplayMode()==Mage_Catalog_Model_Category::DM_PAGE) {
$res = true;
if ($category->getIsAnchor()) {
$state = Mage::getSingleton('catalog/layer')->getState();
if ($state &amp;amp;&amp;amp; $state->getFilters()) {
$res = false;
}
}
}
return $res;
}
}

 

Tags: , , , , , , ,

Post simili:

If you enjoyed this post, please consider to leave a comment or subscribe to the feed and get future articles delivered to your feed reader.

6 Responses to “Get correct Magento multi level categories page title and canonical url”
  1. Business brokers
    13:15 on November 6th, 2012

    Thanks to share this it will be help to me

  2. Catering Bucuresti
    12:22 on September 2nd, 2012

    I do not use magento wright now, but in the future i want to, is a good program

  3. Tim
    12:45 on August 21st, 2012

    Will this also work with newer future versions of magento?

  4. Play some music
    11:30 on August 14th, 2012

    So you know how to put a nofollow link on a whole category ?

  5. eduardo
    10:09 on June 26th, 2012

    Thanks after some debuging and googling i found you post that send me in the right direction.

    in 1.7 i wanted to take the categories away from the title and i replace in the local:
    \app\code\local\Mage\Catalog\Block\Product\View.php

    //$title = $product->getMetaTitle();
    $title = $product->getName()

    Thanks again.

  6. E L James
    20:29 on June 3rd, 2012

    couldnt you rename the file?

Leave a comment

(required)

(required)


*

Categories