繁体   English   中英

Magento-将自定义模块添加到Google网站地图

[英]Magento - Add custom modules to Google sitemap

我有一些自定义模块(我购买或开发了),这些模块在商店中具有前端页面。 如何在Magento生成的Google网站地图中包含这些页面?

生成站点地图的功能是: Mage_Sitemap_Model_Sitemap::generateXml()

它执行以下操作:

  • 打开文件并写入xml标头
  • 获取类别集合并将其写入站点地图文件
  • 获取产品集合并将其写入站点地图文件
  • 获取CMS集合并将其写入站点地图文件
  • 关闭站点地图xml文件

在关闭xml文件之前不会调度任何事件...在这种情况下,您可以扩展此Mage_Sitemap_Model_Sitemap并覆盖generateXml()函数,添加您自己的自定义URL(如果这些URL不在以上任何集合中:category,product,cms页)

解决该问题的另一种方法是使用多个站点地图文件和一个站点地图索引文件(Google支持: http : //googlewebmastercentral.blogspot.co.uk/2006/10/multiple-sitemaps-in-same-directory.html )。 在这种情况下,您可以有一个单独的模块来生成第二个xml网站地图文件。

Magento确实在更高版本中添加了事件sitemap_products_generating_beforesitemap_categories_generating_before事件(我不知道何时,我的版本是1.9.2)。 因此,如果您像我一样踩在这个线程上,寻找将自定义模块页面添加到Google Sitemaps的最佳方法,这就是这些事件的简单之处:

就我而言,我有一个自定义模块,该模块创建动态的“新闻”页面,因此我将事件侦听器添加到模块的config.xml中的<global>标记中。 我选择参加产品站点地图活动*:

    <events>
        <sitemap_products_generating_before>
            <observers>
                <{your_unique_event_observer_name}>
                    <class>{Brand}_{Module}_Model_Observer</class>
                    <method>addPagesToSitemap</method>
                </{your_unique_event_observer_name}>
            </observers>
        </sitemap_products_generating_before>
    </events>

然后,在模块的Observer中,我让方法addPagesToSitemap将额外的项目添加到产品集合(或类别collecton,如果您进行了类别站点地图事件):

class {Brand}_{Module}_Model_Observer
{   
    function addPagesToSitemap(Varien_Event_Observer $observer){

        $sitemapItems = $observer->getEvent()->getCollection()->getItems();

        // Get your module's page collection including their urls
        // Adjust the following lines to your needs
        $collection = Mage::getModel('{brand}_{module}/pages')->getCollection()
            ->addFieldToSelect(array('page_id','url'))
            ->addFieldToFilter('display', 1);
        // My module stores the page path separately,
        // you might don't need this:
        $modulePagePath = Mage::helper('{my-modules-helper}')->getNewsPath();

        foreach($collection as $_item){
            $varienObject = new Varien_Object();
            // We don't want to override 
            // any existing product/category items
            $uniqueId = '{module}'.$_item->getPageId();         
            $varienObject->setId($uniqueId);

            // You might want to adjust this if your item
            // stores the complete url. Don't add the base url tho,
            // Mage_Sitemap_Model_Sitemap::generateXml adds it
            $varienObject->setUrl($modulePagePath . DS . $_item->getUrl());

            $sitemapItems[$uniqueId] = $varienObject;
        }
        $observer->getEvent()->getCollection()->setItems($sitemapItems);

        return $this;
    }
}

而已。 您可以通过在目录> Google Sitemap下手动生成站点地图来对其进行测试。


*由于某些原因,Magento并未添加“ sitemap_pages_generating_before”事件,因此您必须选择与产品或类别相关的事件。 对于这两个事件,Magento都会为您的Magento配置中的类别和产品页面设置相应的changefreq和priority-value。 因此,只需选择值更合适的事件即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM