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

时间:2012-10-23 13:28:51

标签: php magento magento-1.7

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

2 个答案:

答案 0 :(得分:0)

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

执行以下操作:

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

在关闭xml文件之前不会调度任何事件...在这种情况下,您可以扩展此Mage_Sitemap_Model_Sitemap并覆盖generateXml()函数,添加您自己的自定义网址(如果这些网址不在任何网址中)以上馆藏:类别,产品,cms页面)

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

答案 1 :(得分:0)

Magento在以后的版本中添加了事件 sitemap_products_generating_before sitemap_categories_generating_before (我不知道什么时候,我的版本是1.9.2)。因此,如果您像我这样填充这个线程,寻找将自定义模块的页面添加到Google Sitemap的最佳方法,这就是这些事件的简单性:

在我的情况下,我有一个创建动态“新闻”页面的自定义模块,因此我向< global>添加了一个事件监听器。在我的模块的config.xml中标记。我选择使用产品站点地图事件*:

    <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,如果你使用类别sitemap事件):

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

就是这样。您可以通过在目录&gt;下手动生成站点地图来测试它。 Google Sitemap。

*由于某些原因,Magento没有添加“sitemap_pages_generating_before”事件,因此您必须选择产品或类别的事件。对于这两个事件,Magento为类别和&amp;组分别设置了相应的changefreq和priority-value值。 Magento配置中的产品页面。因此,只需选择值更合适的事件。