Magento更改产品页面标题以包含属性

时间:2012-06-03 09:53:57

标签: php magento

我有2个自定义属性,我想添加到产品页面上的<title>标记。它们是“品牌”和“副标题”。

我的页面标题最终会是这样的:

$ brand。“”。$ productname。“”。$ subtitle;

我怎样才能做到这一点?

非常感谢帮助。

5 个答案:

答案 0 :(得分:21)

从您的问题来看,我认为您指的是更改产品的元标题。

您可以选择3个选项:

  1. 浏览每个产品并手动更新(或使用电子表格 并导入)每个产品元标题。这些值是 编辑产品时可在管理区域中使用。
  2. 重写Mage_Catalog_Block_Product_View并覆盖 _prepareLayout()方法,这是生成此标记的位置。
  3. 使用观察者并挂钩到catalog_controller_product_view事件。
  4. 您的决定实际上是在选项2&amp; 3(两者都需要你创建一个自定义模块来实现)。

    在扩展Magento核心功能时,我总是尽量不引人注目 - 所以我会在这里选择选项3。请参阅以下代码以获取完整示例:

    应用程序的/ etc /模块/ Yourcompany_Yourmodule.xml

    <?xml version="1.0"?>
    <config>
        <modules>
            <Yourcompany_Yourmodule>
                <active>true</active>
                <codePool>local</codePool>
            </Yourcompany_Yourmodule>
        </modules>
    </config>
    

    应用程序/代码/本地/ 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>
    

    应用程序/代码/本地/ Yourcompany / Yourmodule /型号/ 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;
        }
    }
    

答案 1 :(得分:4)

以下是在magento

中覆盖产品页面的META逻辑的最简单,最好的方法

复制 /app/code/core/Mage/Catalog/Block/Product/View.php / app / code / local / Mage / Catalog / Block / Product

并覆盖 function _prepareLayout(),我的例子如下:

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();
}

答案 2 :(得分:1)

这是Drew Hunter回答的补充

magento将类别名称包含在标题中,因此正确的解决方案是:

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;
    }
}

答案 3 :(得分:1)

假设您只想更改目录视图页面上的产品标题

在app / design / frontend / default / {your theme Folder} /template/page/html/head.phtml中你可以

<?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 } ?>

请参阅Get Attribute Name And Value Magento

答案 4 :(得分:0)

我相信Drew Hunter提供了大部分正确答案,但我必须做一些改动才能让它发挥作用(EE,1.14.2.x):

在config.xml中:

  

将节点<yourmodule>...</yourmodule>更改为&gt; <yourcompany_yourmodule>...</yourcompany_yourmodule>

在Observer.php中:

  

public function catalog_controller_product_view(Varien_Event_Observer $observer)更改为public function catalog_controller_product_view($observer)