I have 2 custom attributes I\'d like to add to the
tags on product pages. They are \'brand\' and \'subtitle\'.
My page title would end up
Here is the simplest and best way to override META logics for product page in magento
copy /app/code/core/Mage/Catalog/Block/Product/View.php to /app/code/local/Mage/Catalog/Block/Product
and override function _prepareLayout(), my example goes bellow
protected function _prepareLayout()
{
$this->getLayout()->createBlock('catalog/breadcrumbs');
$headBlock = $this->getLayout()->getBlock('head');
if ($headBlock) {
$product = $this->getProduct();
$title = $product->getMetaTitle();
// SEO values start
$categoryCollection = $product->getCategoryCollection();
foreach ($categoryCollection as $k) {
$topCategory = Mage::getModel('catalog/category')->load($k->getId());
break;
}
$brand = $product->getResource()->getAttribute('brand')->getFrontend()->getValue($product);
$shortDescription = $product->getShortDescription();
$suffix = Mage::getStoreConfig('design/head/title_suffix');
// SEO values end
if (!$title) {
$title = $product->getName() .' '.$brand. ' - '. $topCategory->getName() . $suffix;
}
$headBlock->setTitle($title);
$keyword = $product->getMetaKeyword();
$currentCategory = Mage::registry('current_category');
if ($keyword) {
$headBlock->setKeywords($keyword);
} elseif($currentCategory) {
$headBlock->setKeywords($product->getName());
}
$description = $product->getMetaDescription();
if (!$description) {
$description = $brand. ' '. $topCategory->getName() .'. '. $shortDescription;
}
$headBlock->setDescription( ($description) );
// var_dump($title);
// var_dump($description);
if ($this->helper('catalog/product')->canUseCanonicalTag()) {
$params = array('_ignore_category'=>true);
$headBlock->addLinkRel('canonical', $product->getUrlModel()->getUrl($product, $params));
}
}
return parent::_prepareLayout();
}
this is addition to Drew Hunter's answer
magento includes category name into title so the proper solution would be:
class Yourcompany_Yourmodule_Model_Observer
{
/**
* Change product meta title on product view
*
* @pram Varien_Event_Observer $observer
* @return Yourcompany_Yourmodule_Model_Observer
*/
public function catalog_controller_product_view(Varien_Event_Observer $observer)
{
if ($product = $observer->getEvent()->getProduct()) {
if ($category) {
$title = $brand . ' ' . $product->getData('name') . ' - ' . $product->getData('category')->getData('name');
} else {
$title = $brand . ' ' . $product->getData('name');
}
$product->setMetaTitle($title);
}
return $this;
}
}
Assuming that you only want to change the product title on the catalog view page
In app/design/frontend/default/{your theme Folder}/template/page/html/head.phtml you could
<?php if ($_product = Mage::registry('current_product')) { ?>
<title><?php echo $_product->getData('xyz') . ' ' . $_product->getName(); ?></title>
<?php }else{ ?>
<title><?php echo $this->getTitle() ?></title>
<?php } ?>
See Get Attribute Name And Value Magento
I believe Drew Hunter has provided most of the correct answer, but I had to make a few changes to get it to work (EE, 1.14.2.x):
In config.xml:
Change the nodes
<yourmodule>...</yourmodule>
to ><yourcompany_yourmodule>...</yourcompany_yourmodule>
In Observer.php:
Change
public function catalog_controller_product_view(Varien_Event_Observer $observer)
topublic function catalog_controller_product_view($observer)
From your question, I assume you are referring to changing the meta title for products.
There are 3 options open to you:
Your decision is really between options 2 & 3 (both of which will require you to create a custom module to achieve).
I always try to be as unobtrusive as possible when extending Magento core functionality - so I would opt for option 3 here. Please see below code for a complete example:
app/etc/modules/Yourcompany_Yourmodule.xml
<?xml version="1.0"?>
<config>
<modules>
<Yourcompany_Yourmodule>
<active>true</active>
<codePool>local</codePool>
</Yourcompany_Yourmodule>
</modules>
</config>
app/code/local/Yourcompany/Yourmodule/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Yourcompany_Yourmodule>
<version>1.0.0</version>
</Yourcompany_Yourmodule>
</modules>
<global>
<models>
<yourmodule>
<class>Yourcompany_Yourmodule_Model</class>
</yourmodule>
</models>
</global>
<frontend>
<events>
<catalog_controller_product_view>
<observers>
<yourmodule>
<class>Yourcompany_Yourmodule_Model_Observer</class>
<method>catalog_controller_product_view</method>
</yourmodule>
</observers>
</catalog_controller_product_view>
</events>
</frontend>
</config>
app/code/local/Yourcompany/Yourmodule/Model/Observer.php
<?php
class Yourcompany_Yourmodule_Model_Observer
{
/**
* Change product meta title on product view
*
* @pram Varien_Event_Observer $observer
* @return Yourcompany_Yourmodule_Model_Observer
*/
public function catalog_controller_product_view(Varien_Event_Observer $observer)
{
if ($product = $observer->getEvent()->getProduct()) {
$title = $product->getData('brand') . ' ' . $product->getData('name') . ' ' . $product->getData('sub_title');
$product->setMetaTitle($title);
}
return $this;
}
}