【问题标题】:How to edit tag url in magento?如何在magento中编辑标签网址?
【发布时间】:2014-07-07 10:40:46
【问题描述】:

我想在 magento 中制作 SEO 友好的标签 URL。

目前是abc.com/tag/product/list/tagId/17/
但我想做到abc.com/tag/xyz

我尝试过使用“URL 重写管理”,但它不起作用。

请帮忙。

【问题讨论】:

    标签: magento url tags


    【解决方案1】:

    首先我想说这是一个很好的问题。让我兴奋不已。
    它适用于 url 管理,但有点拖累。工作太多了。
    例如,我在 url 管理中添加了这个。

    Type : Custom
    Store: Select any store here - if you have more you have to do this process for each one
    ID Path: TAG_23
    Request Path: tag/camera
    Target Path: tag/product/list/tagId/23
    Redirect: No
    

    已保存。现在当打电话给ROOT/tag/camera 时,我看到带有“相机”标签的产品。
    但可以肯定的是,这不是要走的路。如果您有超过 10 个标签,您会感到无聊。

    所以我们的想法是制作一个模块,让 magento 识别像 tag/something 这样的标签,并将标签的链接更改为与上面相同的格式,这样您就不必编辑很多模板。
    我将模块命名为Easylife_Tag。您需要以下文件。

    app/etc/modules/Easylife_Tag.xml - 声明文件

    <?xml version="1.0"?>
    <config>
        <modules>
            <Easylife_Tag>
                <codePool>local</codePool>
                <active>true</active>
                <depends>
                    <Mage_Tag />
                </depends>
            </Easylife_Tag>
        </modules>
    </config>
    

    app/code/local/Easylife/Tag/etc/config.xml - 配置文件

    <?xml version="1.0"?>
    <config>
        <modules>
            <Easylife_Tag>
                <version>1.0.0</version>
            </Easylife_Tag>
        </modules>
        <global>
            <events>
                <controller_front_init_routers><!-- add a custom router to recognize urls like tag/something -->
                    <observers>
                        <easylife_tag>
                            <class>Easylife_Tag_Controller_Router</class>
                            <method>initControllerRouters</method>
                        </easylife_tag>
                    </observers>
                </controller_front_init_routers>
            </events>
            <models>
                <tag>
                    <rewrite>
                        <tag>Easylife_Tag_Model_Tag</tag><!-- rewrite the tag model to change the url of the tags to tag/something -->
                    </rewrite>
                </tag>
                <tag_resource>
                    <rewrite>
                        <tag>Easylife_Tag_Model_Resource_Tag</tag> <!-- rewrite the tag resource model - see below why is needed -->
                    </rewrite>
                </tag_resource>
            </models>
        </global>
    </config>
    

    app/code/local/Easylife/Tag/Model/Tag.php - 重写的标签模型

    <?php
    class Easylife_Tag_Model_Tag extends Mage_Tag_Model_Tag {
        //change the url from `tag/product/list/tagId/23` to `tag/camera`
        public function getTaggedProductsUrl() {
            return Mage::getUrl('', array('_direct' => 'tag/'.$this->getName()));
        }
    }
    

    app/code/local/Easylife/Tag/Model/Resource/Tag.php - 重写标签资源模型

    <?php
    class Easylife_Tag_Model_Resource_Tag extends Mage_Tag_Model_Resource_Tag {
        //by default, when loading a tag by name magento does not load the store ids it is allowed in
        //this method loads also the store ids
        public function loadByName($model, $name){
            parent::loadByName($model, $name);
            if ($model->getId()) {
                $this->_afterLoad($model);
            }
            else {
                return false;
            }
        }
    }
    

    app/code/local/Easylife/Tag/Controller/Router.php - 自定义路由器 - 参见 cmets inline

    <?php
    class Easylife_Tag_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract{
        public function initControllerRouters($observer){
            $front = $observer->getEvent()->getFront();
            $front->addRouter('easylife_tag', $this);
            return $this;
        }
        public function match(Zend_Controller_Request_Http $request){
            //if magento is not installed redirect to install
            if (!Mage::isInstalled()) {
                Mage::app()->getFrontController()->getResponse()
                    ->setRedirect(Mage::getUrl('install'))
                    ->sendResponse();
                exit;
            }
            //get the url key
            $urlKey = trim($request->getPathInfo(), '/');
            //explode by slash
            $parts = explode('/', $urlKey);
            //if there are not 2 parts (tag/something) in the url we don't care about it.
            //return false and let the rest of the application take care of the url.
            if (count($parts) != 2) {
                return false;
            }
            //if the first part of the url key is not 'tag' we don't care about it
            //return false and let the rest of the application take care of the url
            if ($parts[0] != 'tag') {
                return false;
            }
            $tagName = $parts[1]; //tag name
            //load the tag model
            $tag = Mage::getModel('tag/tag')->loadByName($tagName);
            //if there is no tag with this name available in the current store just do nothing
            if(!$tag->getId() || !$tag->isAvailableInStore()) {
                return false;
            }
            //but if the tag is valid
            //say to magento that the request should be mapped to `tag/product/list/tagId/ID_HERE` - the original url
            $request->setModuleName('tag')
                ->setControllerName('product')
                ->setActionName('list')
                ->setParam('tagId', $tag->getId());
            $request->setAlias(
                Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
                $urlKey
            );
            return true;
        }
    }
    

    就是这样。清除缓存并尝试一下。

    [编辑]
    You can find the full extension here。唯一的区别是它使用community 代码池而不是如上所述的本地代码池。

    【讨论】:

    • Marius,你是 Magento 神
    • @DavidWilkins 删掉它。你让我脸红了。 :)
    • 您最后是如何找到setAlias(... 部分的? Magento 没有任何自动化测试,您是否运行了一组特定的手动测试来捕捉这种东西?老实说,我不知道如何在 magento 中编写安全代码,而这个让我大吃一惊。
    【解决方案2】:

    我正在使用 Magento 1.8.1 并尝试了 Marius 的解决方案,但我遇到了一个问题:2+ 个关键字标签(单词之间有空格)将进入 404 页面,并且 url 中的空格更改为 %20。一个关键字标签就像一个魅力!

    所以,我修改了他的模块,在标签模块上显示一个带空格的单词,并在 URL 中“连字符”。

    文件:Easylife/Tag/Model/Tag.php

    return Mage::getUrl('', array('_direct' => 'tag/'.str_replace(" ", "-", $this->getName())));
    

    文件:Easylife/Tag/Controller/Router.php

    $tagName = str_replace("-", " ", $parts[1]); //tag name
    

    它现在对我有用。

    向 Marius 模块致以最诚挚的问候和感谢!

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      相关资源
      最近更新 更多