我的商店中有前端页面的自定义模块(我购买或开发的)。如何将这些页面包含在 Magento 生成的 Google 站点地图中?
2 回答
生成站点地图的函数是:Mage_Sitemap_Model_Sitemap::generateXml()
它执行以下操作:
- 打开文件并写入 xml 标头
- 获取类别集合并将其写入站点地图文件
- 获取产品集合并将其写入站点地图文件
- 获取 CMS 集合并将其写入站点地图文件
- 关闭站点地图 xml 文件
在关闭 xml 文件之前不会调度任何事件...在这种情况下,您可以扩展它Mage_Sitemap_Model_Sitemap
并覆盖generateXml()
添加您自己的自定义 URL 的函数(如果这些 url 不在上述任何集合中:类别、产品、cms 页面)
解决您的问题的另一种方法是使用多个站点地图文件和一个站点地图索引文件(Google 支持此:http: //googlewebmastercentral.blogspot.co.uk/2006/10/multiple-sitemaps-in-same-directory.html)。在这种情况下,您可以有一个单独的模块来生成第二个 xml 站点地图文件。
Magento 确实在以后的版本中添加了事件sitemap_products_generating_before和sitemap_categories_generating_before(我不知道什么时候,我的版本是 1.9.2)。因此,如果您像我一样偶然发现这个线程,正在寻找将自定义模块页面添加到 Google 站点地图的最佳方法,这些事件就是这么简单:
就我而言,我有一个创建动态“新闻”页面的自定义模块,因此我在模块的 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方法将额外的项目添加到产品集合(或类别集合,如果您使用类别站点地图事件):
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 站点地图下手动生成站点地图来测试它。
*由于某些原因,Magento 没有添加事件“sitemap_pages_generating_before”,因此您必须选择产品或类别的事件。对于这两个事件,Magento 会在您的 Magento 配置中为类别和产品页面设置相应的 changefreq- 和 priority-value 集。因此,只需选择值更适合的事件。